Задания к лабораторной работе по теме «Взаимодействие

advertisement
Задания к лабораторной работе по теме «Взаимодействие процессов» курса «Операционные системы».
1. Разработайте на языке «С» программу, создающую заданное в параметрах количество процессов, посылки сигнала SIGALRM
всем процессам, порожденным задачей, и получения от каждого из них отклика SIGINT. Если за 10 секунд ожидания ответные
сигналы не получены, то программа посылает SIGKILL всем своим потомкам, дожидается их завершения и при благополучном
исходе формирует нулевой код возврата. Если хоть один процесс-потомок завершился с кодом возврата отличным от нуля, то
должен быть сформирован код возврата с максимальным значением, полученным от процессов-потомков.
2. Положим, что существует программа alpha_gamma, которая на каждый из полученных сигналов выводит на стандартный
вывод десятичную цифру, определяемую по номеру сигнала следующим образом:
case
case
case
case
case
case
case
case
case
case
6:
7:
8:
17:
11:
12:
13:
14:
15:
16:
c=’0’;
c=’1’;
c=’2’;
c=’3’;
c=’4’;
c=’5’;
c=’6’;
c=’7’;
c=’8’;
c=’9’;
Напишите головную программу, которая бы вызывала программу alpha_gamma как самостоятельный процесс и с ее помощью
распечатывала бы номер вашей зачетной книжки. По окончании печати alpha_gamma должна быть корректно завершена по
сигналу SIGINT.
#include <stdio.h>
#include <signal.h>
void go_next(int sig)
{char c=’X’;
signal(sig,&go_next)
switch(sig)
{
case 6: c=’0’;
case 7: c=’1’;
case 8: c=’2’;
case 17: c=’3’;
case 11: c=’4’;
case 12: c=’5’;
case 13: c=’6’;
// SIGPIPE
case 14: c=’7’;
// SIGALRM
case 15: c=’8’;
// SIGTERM
case 16: c=’9’;
}
printf(“%c\n”,c);
}
/* ===== Termination procedure ===== */
void stop_go(int sig)
{
printf(”Process %d is stopped by Parent: %d\n”,getpid(),getppid);
exit(1);
}
/* ===== ALPHA_GAMMA process body ===== */
main ()
{
setvbuf (stdout,(char*)NULL,_IONBF,0);
signal(6: ,&go_next);
signal(7: ,&go_next)
signal(8: ,&go_next);
signal(17: ,&go_next);
signal(11: ,&go_next);
signal(12: ,&go_next);
signal(13: ,&go_next);
signal(14: ,&go_next);
signal(15: ,&go_next);
signal(16: ,&go_next)
signal(SIGINT ,&stop_go);
printf(”Alpha_Gamma: %d\n personal number:\n”, getpid());
while (1)
{
pause ();
}
printf(”This message should not be printed\n”);
exit (3);
}
Download