Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <unistd.h>
- #include <sys/types.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <fcntl.h>
- #include <limits.h>
- #include <signal.h>
- volatile __sig_atomic_t flag = 0;
- void handler(int s)
- {
- flag = 1;
- }
- int main(int argc, char *argv[])
- {
- setbuf(stdin, NULL);
- sigaction(SIGUSR1, &(struct sigaction) {.sa_handler=handler, .sa_flags=SA_RESTART}, NULL);
- pid_t proc1 = getpid();
- long long int mul;
- long long int tmp;
- sscanf(argv[1], "%lld", &mul);
- int fd[2];
- pipe(fd);
- pid_t proc2;
- if ((proc2 = fork()) == 0) {
- proc2 = getpid();
- pid_t proc3;
- if ((proc3 = fork()) == 0) {
- while (1) {
- while (flag == 0) {
- pause();
- }
- flag = 0;
- read(fd[0], &tmp, sizeof(tmp));
- tmp *= mul;
- write(fd[1], &tmp, sizeof(tmp));
- kill(proc1, SIGUSR1);
- }
- }
- flag = 1;
- while (scanf("%lld", &tmp) != EOF) {
- while (flag == 0) {
- pause();
- }
- flag = 0;
- write(fd[1], &tmp, sizeof(tmp));
- kill(proc3, SIGUSR1);
- }
- kill(proc1, SIGINT);
- kill(proc3, SIGINT);
- exit(0);
- }
- while (1) {
- while (flag == 0) {
- pause();
- }
- read(fd[0], &tmp, sizeof(tmp));
- printf("%lld\n", tmp);
- fflush(stdout);
- flag = 0;
- kill(proc2, SIGUSR1);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement