Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <err.h>
- #include <signal.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/signalfd.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- #include <unistd.h>
- void child_main(int id, int pipefd[2], int n) {
- printf("hi %d\n", id);
- fflush(stdout);
- sigset_t mask;
- sigemptyset(&mask);
- sigaddset(&mask, SIGUSR1);
- int sigfd = signalfd(-1, &mask, 0);
- struct signalfd_siginfo siginfo;
- char buf[64];
- read(sigfd, &siginfo, sizeof siginfo);
- read(pipefd[0], buf, sizeof buf);
- pid_t other;
- {
- uintmax_t tmp;
- sscanf(buf, "%ju", &tmp);
- other = tmp;
- }
- for (;;) {
- read(sigfd, &siginfo, sizeof siginfo);
- read(pipefd[0], buf, sizeof buf);
- int num;
- sscanf(buf, "%d", &num);
- if (num > n)
- break;
- printf("%d %d\n", id, num);
- fflush(stdout);
- sprintf(buf, "%d", num+1);
- kill(other, SIGUSR1);
- write(pipefd[1], buf, sizeof buf);
- if (num == n)
- break;
- }
- exit(0);
- }
- int main(int argc, char **argv) {
- if (argc < 2)
- errx(1, "Usage: %s N", argv[0]);
- int n;
- sscanf(argv[1], "%d", &n);
- int pipefd[2];
- if (pipe(pipefd) == -1)
- err(1, "pipe() failed");
- pid_t child1 = fork();
- if (child1 == -1)
- err(1, "fork() failed");
- if (child1 == 0)
- child_main(1, pipefd, n);
- pid_t child2 = fork();
- if (child2 == -1)
- err(1, "fork() failed");
- if (child2 == 0)
- child_main(2, pipefd, n);
- char buf[64];
- sprintf(buf, "%ju", (uintmax_t) child2);
- kill(child1, SIGUSR1);
- write(pipefd[1], buf, sizeof buf);
- sprintf(buf, "%ju", (uintmax_t) child1);
- kill(child2, SIGUSR1);
- write(pipefd[1], buf, sizeof buf);
- kill(child1, SIGUSR1);
- sprintf(buf, "1");
- write(pipefd[1], buf, sizeof buf);
- close(pipefd[0]);
- close(pipefd[1]);
- waitpid(child1, NULL, 0);
- waitpid(child2, NULL, 0);
- exit(0);
- }
- sm19/5.c
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement