Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Написать программу на Си, реализующую следующие действия.
- A) Порождение цепочки родственных процессов А->В->С->D->Е. В каждом из порожденных процессов предусмотрена обработка сигнала sigtrap: при приходе данного сигнала процесс печатает свой PID и завершает работу.
- Б) Все процессы должны быть циклически связаны каналами (каждая пара соседей связаны одним каналом, процесс Е связан каналом с процессом А)
- В) Процесс А передаёт прoцеccу B через канал свой PID.
- Процесс B передает процессу C массив из двух элементов: в нулевом – PID процесса A, в первом – PID процесса B.
- Процесс C передает процессу D массив из трех элементов: в нулевом – PID процесса A, в первом – PID процесса B, во втором – PID процесса С.
- ...
- Процесс E передает процессу A массив из пяти элементов: в нулевом – PID процесса A,.. в последнем – PID процесса E.
- Г) Процесс A посылает процессам B,C,D,E сигнал sigtrap и завершает свою работу.
- -------------------------------------------------------------------------------------------------------
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <fcntl.h>
- #include <signal.h>
- #include <string.h>
- #define N 5 //количество процессов (не меньше двух)
- void Handler(int SigN);
- void NewProcess(int K);
- void Function(int K);
- int PD[N][2]; //массив каналов
- int main(int argc, char**argv)
- {
- int i;
- signal(SIGTRAP,Handler);
- for(i=0;i<N;i++)
- pipe(PD[i]);
- if (fork()) //процесс-предок
- {
- pid_t PID0=getpid(),rPIDs[N]; //PID предка; PIDы, полученные из последнего процесса
- printf("#1: Parent %d starts\n",PID0);
- write(PD[0][1],&PID0,sizeof(PID0) ); //отправили PID самого первого процесса следующему
- read (PD[N-1][0],&rPIDs,sizeof(rPIDs) ); //ждем и прочитываем PIDы всех процессов
- //~ for(i=0;i<N;i++)
- //~ printf("%c: %d\n",'A'+i,rPIDs[i]);
- for(i=1;i<N;i++)
- kill(rPIDs[i],SIGTRAP);
- for(i=0;i<N;i++) //закрываем все каналы
- { close(PD[i][0]); close(PD[i][1]); }
- printf("Parent #%d died\n",getpid() );
- return 0;
- }
- else //2-й процесс
- NewProcess(2); //рекурсивная функция по созданию процессов
- return 1;
- }
- void Function(int K) //тело каждого процесса-потомка
- {
- pid_t rPIDs[K-1],sPIDs[K]; //PIDы, полученные из последнего процесса и отправляемые следующему
- int i;
- printf("#%d: Child %d was born\n",K,getpid() );
- read (PD[K-2][0],&rPIDs,sizeof(rPIDs) ); //читаем отправленные предыдущим процессом PIDы
- for(i=0;i<K;i++)
- sPIDs[i]=rPIDs[i];
- sPIDs[K-1]=getpid(); //заполняем массив предыдущими PIDами и PIDом текущего процесса
- write(PD[K-1][1],&sPIDs,sizeof(sPIDs) ); //отправляем PIDы следующему процессу
- for(i=0;i<N;i++) //закрываем все каналы
- { close(PD[i][0]); close(PD[i][1]); }
- for(;;);
- }
- void NewProcess(int K)
- {
- if (K==N) //в последнем процессе не создаем новых процессов, только передача массива
- Function(K);
- else
- if(fork())
- Function(K);
- else
- NewProcess(K+1);
- }
- void Handler(int SigN)
- {
- signal(SIGTRAP,Handler);
- //при получении сигнала процесс печатает свой PID и завершается
- printf("Child #%d killed\n",getpid() );
- exit(0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement