Advertisement
Guest User

ex4 model

a guest
May 23rd, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.11 KB | None | 0 0
  1. #include <unistd.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4.  
  5. pid_t pid1, pid2;
  6. int p[2], q[2], r[2], t[2];
  7.  
  8. int main()
  9. {
  10.     char c;
  11.    
  12.     if(-1 == pipe(p))
  13.     {
  14.         printf("Eroare la primul pipe");
  15.         exit(2);
  16.     }
  17.  
  18.     if(-1 == pipe(q))
  19.     {
  20.         printf("Eroare la al doilea pipe");
  21.         exit(2);
  22.     }
  23.  
  24.     if(-1 == pipe(r))
  25.     {
  26.         printf("Eroare la al treilea pipe");
  27.         exit(2);
  28.     }
  29.  
  30.     if(-1 == pipe(t))
  31.     {
  32.         printf("Eroare la al patrulea pipe");
  33.         exit(2);
  34.     }
  35.  
  36.     if(-1 == (pid1 = fork()))
  37.     {
  38.         printf("Eroare la primul fork().");
  39.         exit(1);
  40.     }
  41.  
  42.     if(pid1)
  43.     {
  44.         if(-1 == (pid2 = fork()))
  45.         {
  46.             printf("Eroare la al doilea fork().");
  47.             exit(1);
  48.         }
  49.     }
  50.  
  51.     if(pid1 && pid2)
  52.     {
  53.         // Doar tatal
  54.        
  55.         // Vom presupune ca in loc de CTRL + D facem pana la citirea lui zero (care nu e nici pozitiv nici negativ)
  56.        
  57.         close(p[0]);
  58.         close(q[0]);
  59.         close(r[1]);
  60.         close(t[1]);
  61.  
  62.         int nr;
  63.         do
  64.         {
  65.             scanf("%d", &nr);
  66.             if(nr == 0) break;
  67.             if(nr > 0)
  68.             {
  69.                 write(p[1], &nr, sizeof(nr));
  70.             }
  71.             else
  72.             {
  73.                 write(q[1], &nr, sizeof(nr));
  74.             }
  75.             nr = 0;
  76.         } while(1);
  77.  
  78.         close(p[1]);
  79.         close(q[1]);
  80.        
  81.         int s1, s2;
  82.        
  83.         wait(NULL);
  84.         wait(NULL);
  85.        
  86.         read(r[0], &s1, sizeof(nr));
  87.         read(t[0], &s2, sizeof(nr));
  88.        
  89.         close(r[0]);
  90.         close(t[0]);
  91.  
  92.         printf("Sunt procesul tata cu pid = %d si suma totala este: %d\n", getpid(), s1 + s2);
  93.     }
  94.    
  95.     if(!pid1)
  96.     {
  97.         close(q[0]);
  98.         close(q[1]);
  99.         close(p[1]);
  100.         close(r[0]);
  101.  
  102.         close(t[0]);
  103.         close(t[1]);
  104.  
  105.         int nr, s = 0;
  106.         while(read(p[0], &nr, sizeof(nr)))
  107.         {
  108.             printf("Fiul 1: %d\n", nr);
  109.             s += nr;
  110.         }
  111.         close(p[0]);
  112.  
  113.         printf("Sunt fiul 1 cu pid %d si am suma: %d\n", getpid(), s);
  114.        
  115.         write(r[1], &s, sizeof(s));
  116.         close(r[1]);
  117.     }
  118.    
  119.     if(pid1 && !pid2)
  120.     {
  121.         close(p[0]);
  122.         close(p[1]);
  123.         close(q[1]);
  124.         close(t[0]);
  125.  
  126.         close(r[0]);
  127.         close(r[1]);
  128.  
  129.         int nr, s = 0;
  130.         while(read(q[0], &nr, sizeof(nr)))
  131.         {
  132.             printf("Fiul 2: %d\n", nr);
  133.             s += nr;
  134.         }
  135.         close(q[0]);
  136.  
  137.         printf("Sunt fiul 2 cu pid = %d si am suma: %d\n", getpid(), s);
  138.  
  139.         write(t[1], &s, sizeof(s));
  140.         close(t[1]);
  141.     }
  142.  
  143.     return 0;
  144. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement