Advertisement
volkovich_maksim

8.18.e

Nov 29th, 2016
356
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.66 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <errno.h>
  3. #include <sys/wait.h>
  4. #include <unistd.h>
  5. #include <stdlib.h>
  6. #include <sys/types.h>
  7. #include <sys/stat.h>
  8. #include <fcntl.h>
  9.  
  10. int main(int argc, char *argv[]){
  11. // pr1 < f.dat | pr2 | pr3 > f.res
  12.  
  13.     int pid1, pid2, pid3;
  14.     int fd1[2], fd2[1];
  15.  
  16.     if (pipe(fd1) == -1) exit(1);
  17.     pipe(fd2);
  18.  
  19.     if ((pid1 = fork()) == -1){
  20.         perror("fork\n");
  21.         exit(1);
  22.     }else if (pid1 == 0){//son1
  23.         int fd_dat;
  24.         if ((fd_dat = open(argv[2], O_RDONLY)) == -1){
  25.             perror("open data\n");
  26.             exit(1);
  27.         }
  28.         dup2(fd_dat, 0);
  29.         dup2(fd1[1],1);
  30.         close(fd1[1]);
  31.         close(fd1[0]);
  32.         close(fd2[0]);
  33.         close(fd2[1]);
  34.         //close(fd_dat);
  35.         execlp(argv[1], argv[1], NULL);
  36.         perror("execlp\n");
  37.         _exit(1);
  38.     }
  39.    
  40.     if ((pid2 = fork()) == -1){
  41.         perror("fork\n");
  42.         exit(1);
  43.     }else if (pid2 == 0){//son
  44.         if (dup2(fd1[0],0) == -1){
  45.             perror("dup2\n");
  46.             exit(1);
  47.         }
  48.         dup2(fd2[1],1);
  49. //      close(fd1[0]);
  50. //      close(fd1[1]);
  51.         close(fd2[0]);
  52.         close(fd2[1]);
  53.         execlp(argv[3],argv[3],NULL);
  54.         perror("execlp\n");
  55.         _exit(1);
  56.     }
  57.  
  58.     if ((pid3 = fork()) == -1){
  59.         perror("fork\n");
  60.         exit(1);
  61.     }else if (pid3 == 0){//son
  62.         int fd_res;
  63.         if ((fd_res = open(argv[5], O_CREAT | O_WRONLY | O_TRUNC, 0777)) == -1){
  64.             perror("open result\n");
  65.             exit(1);
  66.         }
  67.         dup2(fd2[0],0);
  68.         dup2(fd_res, 1);
  69. printf("2\n");
  70.         close(fd1[0]);
  71.         close(fd1[1]);
  72.         close(fd2[0]);
  73.         close(fd2[1]);
  74.         //close(fd_res);
  75.         execlp(argv[4], argv[4], NULL);
  76.         perror("execlp\n");
  77.         _exit(1);
  78.     }
  79.     close(fd1[1]);
  80.     close(fd1[0]);
  81.     close(fd2[1]);
  82.     close(fd2[0]);
  83. //  close(fd_dat);
  84. //  close(fd_res);
  85.     wait(NULL);
  86.     wait(NULL);
  87.     wait(NULL);
  88.     return 0;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement