Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <signal.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <stdio.h>
- #include <signal.h>
- enum { INTEGER_BASE = 10 };
- volatile sig_atomic_t flag = 0;
- pid_t pid1, pid2;
- void
- handler(int s)
- {
- flag = 1;
- }
- void
- work(int serial, FILE *p1, FILE *p2, int maximum)
- {
- pid_t pid;
- int val;
- while (1) {
- sigset_t s2;
- sigemptyset(&s2);
- while (!flag) {
- sigsuspend(&s2);
- }
- flag = 0;
- //fscanf(p1, "%d", &pid);
- if (getpid() == pid1) {
- pid = pid2;
- } else {
- pid = pid1;
- }
- if (pid == -1) {
- break;
- }
- fscanf(p1, "%d", &val);
- if (val >= maximum) {
- fprintf(p2, "%d\n", -1);
- kill(pid, SIGUSR1);
- break;
- }
- printf("%d %d\n", serial, val);
- fflush(stdout);
- //fprintf(p2, "%d\n", getpid());
- //fflush(p2);
- fprintf(p2, "%d\n", val+1);
- fflush(p2);
- kill(pid, SIGUSR1);
- }
- fclose(p1);
- fclose(p2);
- _exit(0);
- }
- void
- execute(int ser, FILE *f1_r, FILE *f1_w, int maximum)
- {
- pid_t pid = fork();
- if (pid == -1) {
- _exit(1);
- } else if (!pid) {
- if (ser == 1) {
- pid1 = getpid();
- } else {
- pid2 = getpid();
- }
- work(ser, f1_r, f1_w, maximum);
- _exit(0);
- }
- return;
- }
- int
- main(int argc, char *argv[])
- {
- FILE *f1_r, *f1_w;
- int p1[2], maximum, val = 1;
- pipe(p1);
- f1_w = fdopen(p1[1], "w");
- f1_r = fdopen(p1[0], "r");
- maximum = strtol(argv[1], NULL, INTEGER_BASE);
- sigset_t s1;
- sigemptyset(&s1);
- sigaddset(&s1, SIGUSR1);
- sigprocmask(SIG_BLOCK, &s1, NULL);
- sigaction(SIGUSR1, &(struct sigaction){ .sa_handler = handler, .sa_flags = SA_RESTART }, NULL);
- execute(1, f1_r, f1_w, maximum);
- execute(2, f1_r, f1_w, maximum);
- //fprintf(f1_w, "%d\n", pid2);
- //fflush(f1_w);
- fprintf(f1_w, "%d\n", val);
- fflush(f1_w);
- kill(pid1, SIGUSR1);
- fclose(f1_w);
- fclose(f1_r);
- waitpid(pid1, NULL, 0);
- waitpid(pid2, NULL, 0);
- printf("Done\n");
- fflush(stdout);
- }
- //код частично позаимствован из конспектов
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement