Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <errno.h>
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/msg.h>
- #include <signal.h>
- #include <sys/wait.h>
- #include <unistd.h>
- struct Message
- {
- long type;
- long long x[2];
- };
- int main(int argc, char *argv[])
- {
- struct Message Mess;
- char *eptr;
- key_t key = strtol(argv[1], &eptr, 10);
- int n = strtol(argv[2], &eptr, 10);
- long long maxval = strtol(argv[5], &eptr, 10);
- int msg = msgget(key, 0666 | IPC_CREAT | IPC_EXCL)ΠΆ
- pid_t *pid = calloc(n, sizeof(*pid));
- Mess.x[0] = strtol(argv[3], &eptr, 10);
- Mess.x[1] = strtol(argv[4], &eptr, 10);
- Mess.type = 1;
- for(int i = 0; i < n; i++) {
- if ((pid[i] = fork()) == -1) {
- for(int i = 0; i < n; i++) {
- kill(pid[i], SIGKILL);
- }
- while (wait(NULL) != -1);
- msgctl(msg, IPC_RMID, 0);
- free(pid);
- _exit(1);
- }
- if (!pid[i]) {
- while (1) {
- if (msgrcv(msg, &Mess, sizeof(Mess.x), i + 1, 0) != -1) {
- free(pid);
- _exit(0);
- }
- long long x0 = Mess.x[0];
- Mess.x[0] = Mess.x[1];
- Mess.x[1] = x0 + Mess.x[1];
- printf("%d %lld\n", i, Mess.x[1]);
- fflush(stdout);
- if (Mess.x[1] > maxval) {
- for(int i = 0; i < n; i++) {
- kill(pid[i], SIGKILL);
- }
- free(pid);
- msgctl(msg, IPC_RMID, 0);
- _exit(0);
- } else {
- Mess.type = Mess.x[1] % n + 1;
- msgsnd(msg, &Mess, sizeof(Mess.x), 0);
- }
- }
- _exit(0);
- }
- }
- msgsnd(msg, &Mess, sizeof(Mess.x), 0);
- while(wait(NULL) != -1);
- msgctl(msg, IPC_RMID, 0);
- free(pid);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement