Advertisement
Guest User

8 (по счету)

a guest
May 23rd, 2015
258
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.68 KB | None | 0 0
  1. #include <sys/types.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <sys/wait.h>
  6. #include <string.h>
  7.  
  8. int K0[2];
  9. int K1[2];
  10.  
  11. int interrupt = 0;
  12.  
  13. void my_pause(){
  14.         while(!interrupt){}
  15. }
  16.  
  17. void hdl(int sig){
  18.         if(sig == SIGUSR1){
  19.                 interrupt = 1;
  20.         }
  21. }
  22.  
  23. int main(){
  24.         signal(SIGUSR1, hdl);
  25.        
  26.         pid_t P1;
  27.        
  28.         pipe(K0);
  29.         pipe(K1);
  30.        
  31.         P1 = fork();
  32.        
  33.         if (P1 == 0){
  34.                 printf("        Start P1\n");
  35.                
  36.                 pid_t P3;
  37.                 P3 = fork();
  38.                        
  39.                                        
  40.                 if (P3 == 0){
  41.                         printf("                        Start P3\n");  
  42.                        
  43.                         close(K1[0]);
  44.                        
  45.                         pid_t iam = getpid();
  46.                         char text[] = "First message from P3 to parent thread !"; //сообщение
  47.                         char message[44];
  48.                         sprintf(message,"%d%s",iam,text);
  49.                        
  50.                         write(K1[1],message,44);                      
  51.                         printf("                        Send data from P3 to Р0\n");
  52.                        
  53.                         kill(getppid(),SIGUSR1);
  54.                         printf("                        Send signal from P3 to P1\n");
  55.                        
  56.                         my_pause();
  57.                         printf("                        Get signal from P2\n");
  58.                        
  59.                         //close(K1[0]);
  60.                         char text1[] = "Second message from P3 to parent thread!";
  61.                         sprintf(message,"%d%s",iam,text1);
  62.                        
  63.                         write(K1[1],message,44);
  64.                         printf("                        Send data from P3 to Р0\n");
  65.                        
  66.                         printf("                        End P3\n");    
  67.                         exit(0);
  68.                 }
  69.                 else{
  70.                         close(K1[0]);
  71.                         close(K0[0]);
  72.                        
  73.                         my_pause();
  74.                         printf("        Get signal from P3\n");
  75.                        
  76.                         pid_t iam = getpid();
  77.                         char text[] = "Message from P1 thread to parent thread!";
  78.                         char message[44];
  79.                         sprintf(message,"%d%s",iam,text);
  80.                        
  81.                         write(K1[1],message,44);
  82.                         printf("        Send data from P1 to P0\n");
  83.                        
  84.                         char pid[4];
  85.                         sprintf(pid,"%d",P3);
  86.                        
  87.                         write(K0[1],pid,4);
  88.                         printf("        Send pid P3 to P2 by K0\n");
  89.                        
  90.                         int signal;
  91.                         waitpid(P3,&signal,0);
  92.                         printf("        Waited for end of P3\n");
  93.                        
  94.                         printf("        End P1\n");
  95.                         exit(0);
  96.                 }
  97.         }
  98.         else{
  99.                
  100.                 pid_t P2;
  101.                
  102.                 P2 = fork();
  103.                
  104.                 if (P2 == 0){
  105.                         close(K1[0]);
  106.                         close(K0[1]);
  107.                        
  108.                         int pid;
  109.                         char pid_s[4];
  110.                         printf("                Start P2\n");
  111.                         printf("                Wait for data from K0\n");
  112.                         read(K0[0],pid_s,4);
  113.                         pid = atoi(pid_s);
  114.                         printf("                Get a pid of P3 from P1 by K0\n");
  115.                        
  116.                         pid_t iam = getpid();
  117.                         char text[] = "Message from P2 thread to parent thread!";
  118.                         char message[44];
  119.                         sprintf(message,"%d%s",iam,text);
  120.                        
  121.                         write(K1[1],message,44);
  122.                         printf("                Send data from P2 to P0\n");
  123.                        
  124.                         kill(pid,SIGUSR1);
  125.                         printf("                Send signal from P2 to P3\n");
  126.                        
  127.                         printf("                End P2\n");
  128.                         exit(0);
  129.                        
  130.                 }
  131.                 else{
  132.                         close(K1[1]);
  133.                
  134.                         int status;
  135.                         waitpid(P1,&status,0);
  136.                        
  137.                         printf("Waited for end of child thread\n");
  138.                
  139.                         char messages[44];
  140.                        
  141.                         printf("All messages from child thread:\n");
  142.                         read(K1[0],messages,44);
  143.                         write(1,messages,44);
  144.                         printf("\n");
  145.                        
  146.                         read(K1[0],messages,44);
  147.                         write(1,messages,44);
  148.                         printf("\n");
  149.                        
  150.                         read(K1[0],messages,44);
  151.                         write(1,messages,44);
  152.                         printf("\n");
  153.                        
  154.                         read(K1[0],messages,44);
  155.                         write(1,messages,44);
  156.                         printf("\n");
  157.                 }
  158.         }
  159.         return 0;
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement