Advertisement
Rainbow_Helicopter

Задание #7.1. А->В->С->D->Е

Jan 14th, 2013
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.30 KB | None | 0 0
  1. Написать программу на Си, реализующую следующие действия.
  2. A) Порождение цепочки родственных процессов А->В->С->D->Е. В каждом из порожденных процессов предусмотрена обработка сигнала sigtrap: при приходе данного сигнала процесс печатает свой PID и завершает работу.
  3. Б) Все процессы должны быть циклически связаны каналами (каждая пара соседей связаны одним каналом, процесс Е связан каналом с процессом А)
  4. В) Процесс А передаёт прoцеccу B через канал свой PID.
  5. Процесс B передает процессу C массив из двух элементов: в нулевом – PID процесса A, в первом – PID процесса B.
  6. Процесс C передает процессу D массив из трех элементов: в нулевом – PID процесса A, в первом – PID процесса B, во втором – PID процесса С.
  7. ...
  8. Процесс E передает процессу A массив из пяти элементов: в нулевом – PID процесса A,.. в последнем – PID процесса E.
  9. Г) Процесс A посылает процессам B,C,D,E сигнал sigtrap и завершает свою работу.
  10. -------------------------------------------------------------------------------------------------------
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <unistd.h>
  14. #include <sys/types.h>
  15. #include <fcntl.h>
  16. #include <signal.h>
  17. #include <string.h>
  18.  
  19. #define N 5 //количество процессов (не меньше двух)
  20.  
  21. void Handler(int SigN);
  22. void NewProcess(int K);
  23. void Function(int K);
  24.  
  25. int PD[N][2]; //массив каналов
  26.  
  27. int main(int argc, char**argv)
  28. {
  29.     int i;
  30.  
  31.     signal(SIGTRAP,Handler);
  32.     for(i=0;i<N;i++)
  33.      pipe(PD[i]);
  34.    
  35.     if (fork()) //процесс-предок
  36.     {
  37.         pid_t PID0=getpid(),rPIDs[N]; //PID предка; PIDы, полученные из последнего процесса
  38.        
  39.         printf("#1: Parent %d starts\n",PID0);
  40.        
  41.         write(PD[0][1],&PID0,sizeof(PID0) ); //отправили PID самого первого процесса следующему
  42.         read (PD[N-1][0],&rPIDs,sizeof(rPIDs) ); //ждем и прочитываем PIDы всех процессов
  43.        
  44.         //~ for(i=0;i<N;i++)
  45.          //~ printf("%c: %d\n",'A'+i,rPIDs[i]);
  46.            
  47.         for(i=1;i<N;i++)
  48.          kill(rPIDs[i],SIGTRAP);
  49.        
  50.         for(i=0;i<N;i++) //закрываем все каналы
  51.         { close(PD[i][0]); close(PD[i][1]); }
  52.        
  53.         printf("Parent #%d died\n",getpid() );
  54.         return 0;
  55.     }
  56.    
  57.     else //2-й процесс
  58.      NewProcess(2); //рекурсивная функция по созданию процессов
  59.     return 1;
  60. }
  61.  
  62. void Function(int K) //тело каждого процесса-потомка
  63. {
  64.     pid_t rPIDs[K-1],sPIDs[K]; //PIDы, полученные из последнего процесса и отправляемые следующему
  65.     int i;
  66.    
  67.     printf("#%d: Child %d was born\n",K,getpid() );
  68.    
  69.     read (PD[K-2][0],&rPIDs,sizeof(rPIDs) ); //читаем отправленные предыдущим процессом PIDы
  70.  
  71.     for(i=0;i<K;i++)
  72.      sPIDs[i]=rPIDs[i];
  73.     sPIDs[K-1]=getpid(); //заполняем массив предыдущими PIDами и PIDом текущего процесса
  74.  
  75.     write(PD[K-1][1],&sPIDs,sizeof(sPIDs) ); //отправляем PIDы следующему процессу
  76.    
  77.     for(i=0;i<N;i++) //закрываем все каналы
  78.     { close(PD[i][0]); close(PD[i][1]); }
  79.    
  80.     for(;;);
  81. }
  82.  
  83. void NewProcess(int K)
  84. {
  85.     if (K==N) //в последнем процессе не создаем новых процессов, только передача массива
  86.      Function(K);
  87.     else
  88.         if(fork())
  89.          Function(K);
  90.         else
  91.          NewProcess(K+1);
  92. }
  93.  
  94. void Handler(int SigN)
  95. {
  96.     signal(SIGTRAP,Handler);
  97.     //при получении сигнала процесс печатает свой PID и завершается
  98.     printf("Child #%d killed\n",getpid() );
  99.     exit(0);
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement