Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- #include <unistd.h>
- #include <errno.h>
- #include <signal.h>
- volatile sig_atomic_t flag = 0;
- int targetpid;
- int max;
- void handler(int signal) {
- flag = 1;
- }
- void proc(FILE *fr, FILE *fw, int curr)
- {
- int x;
- while (1) {
- while (!flag) {
- pause();
- }
- flag = 0;
- fscanf(fr, "%d", &x);
- if (x >= max) {
- break;
- }
- printf("%d %d\n", curr, x);
- fflush(stdout);
- x++;
- fprintf(fw, "%d\n", x);
- kill(targetpid, SIGUSR1);
- fflush(fw);
- }
- fclose(fr);
- fclose(fw);
- }
- int main(int argc, char *argv[]) {
- max = strtol(argv[1], NULL, 10);
- int fd[2];
- pipe(fd);
- FILE *fr = fdopen(fd[0], "r");
- FILE *fw = fdopen(fd[1], "w");
- struct sigaction action =
- {
- .sa_handler = handler,
- .sa_flags = SA_RESTART
- };
- sigaction(SIGUSR1, &action, NULL);
- int pid1;
- int pid2;
- if (!(pid1 = fork())) {
- while (!flag) {
- pause();
- }
- fscanf(fr, "%d", &targetpid);
- proc(fr, fw, 1);
- close(fd[0]);
- close(fd[1]);
- exit(0);
- }
- if (!(pid2 = fork())) {
- while (!flag) {
- pause();
- }
- flag = 0;
- fscanf(fr, "%d", &targetpid);
- fprintf(fw, "%d\n", getpid());
- fflush(fw);
- fprintf(fw, "%d\n", 1);
- fflush(fw);
- kill(targetpid, SIGUSR1);
- proc(fr, fw, 2);
- close(fd[0]);
- close(fd[1]);
- exit(0);
- }
- fprintf(fw, "%d\n", pid1);
- fflush(fw);
- fclose(fr);
- fclose(fw);
- close(fd[1]);
- close(fd[0]);
- kill(pid2, SIGUSR1);
- int finish = wait(NULL);
- if (finish == pid1) {
- kill(pid2, SIGKILL);
- } else {
- kill(pid1, SIGKILL);
- }
- wait(NULL);
- printf("Done\n");
- fflush(stdout);
- exit(0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement