Министерство Образования Российской Федерации
Хабаровский Государственный Технический Университет
Лабораторная работа №6
По дисциплине «Операционные системы»
Тема: «Межпроцессные коммуникации - каналы и сигналы»Цель работы:Изучение средств межпроцессных коммуникаций, предоставляемых ОС Linux, на примере неименованных каналов. Знакомство с сигналами ОС и с функциями для работы с ними.
Задание:
Текст и результат работы программы:
Листинг программы:
#include <stdio.h>
#include <pthread.h>
#include <time.h>
#include <signal.h>
int (*oldHandler)();
int roditel_write [100][2];
int potomok_write [100][2];
int delete_pipe [2];
pthread_t potok[100];
const max = 50;
pthread_mutex_t del;
time_t now;
//======================
void Obrabotchik()//===Обработчик сигнала===
{
int pid,number;
read(delete_pipe[0],(void *)&number,sizeof(int));
read(delete_pipe[0],(void *)&pid,sizeof(int));
time(&now);
printf("Поток номер %d закрылся.Время=%s",number+1,ctime(&now));
pthread_cancel(potok[number]);
kill(pid,SIGKILL);
close(roditel_write[number][1]);//4
close(potomok_write[number][0]);//4
};
//======================
potomok_process(int number)
{
int potomok_get,sum = 0;//===Читает из канала===
int potomok_put = 0;//===Пишет в канал===
while (1)
{
if ((read(roditel_write[number][0],(void *)&potomok_get,sizeof(int))))
{
sleep(1);
time(&now);
printf("Потомок номер %d получил число %d.Время=%s\n",number+1,potomok_get,ctime(&now));
sum += potomok_get;
if (sum > max)
{
potomok_put = getpid();
}
write(potomok_write[number][1],(void *)&potomok_put,sizeof(int));
if (sum > max)
{
sleep(1);
close (roditel_write[number][0]);//2
close (potomok_write [number][1]);//2
pthread_mutex_lock (&del);//2
write(delete_pipe [1],(void *)&number,sizeof(int));
write(delete_pipe [1],(void *)&potomok_put,sizeof(int));
pthread_mutex_unlock (&del);
while(1){kill(getppid(),SIGUSR1);sleep(1);}
}
sleep(rand()%3);
}
}
}
//=======================
void* roditel_potok (void* chislo)
{
int number = *(int *)chislo;
int roditel_get;
int roditel_put;
while (1)
{
roditel_put = rand() % 40;
write (roditel_write[number][1],(void *)&roditel_put,sizeof(int));
time(&now);
printf("Родитель послал число %d потомку %d.Время=%s\n",roditel_put,number+1,ctime(&now));
if (read(potomok_write[number][0],(void *)&roditel_get,sizeof(int)))
{
if (roditel_get != 0){time(&now);printf("Родитель получил код на удаление %d.Время=%s\n",number+1,ctime(&now));pause();};
};
sleep (rand()%2);
}
}
//=======================
int main (int argc,char *argv[])
{
int kol = atoi(argv[1]);
time(&now);
printf("Количесво дочерних процессов равно %d.Время=%s\n",kol,ctime(&now));
int status;
int i;
int RoditelPID = getpid();
int is_potomok;
pthread_mutex_init(&del,NULL);
signal(SIGUSR1,Obrabotchik);
oldHandler == signal(SIGINT,SIG_IGN);
pipe (delete_pipe);
for (i=0 ; i<kol ; i++)
{
pipe (roditel_write[i]);
pipe (potomok_write [i]);
is_potomok = fork();
if ((!is_potomok) && (getppid() == RoditelPID))//===Проверка на потомка===
{
close (roditel_write[i][1]);//1
close (potomok_write [i][0]);//1
close (delete_pipe[0]);//===Создаётся канал на удаление===
time(&now);
printf ("Создался потомок номер %d.Время=%s\n",i+1,ctime(&now));
potomok_process(i);
}
else
{
if (getpid() == RoditelPID)//===Проверяется на родителя===
{
close (roditel_write [i][0]);//3
close (potomok_write [i][1]);//3
pthread_create(&potok[i],NULL,roditel_potok,&i);
sleep (1);
}
else{kill(getpid(),SIGKILL);};
}
}
for (i=0 ;i<kol ; i++)//===Ждёт окончания
{pthread_join(potok[i],NULL);}//всех потоков===
close (delete_pipe [1]);
signal(SIGINT, oldHandler);
return 0;
}
Результат выполнения программы:
[sasha@localhost Fas]$ ./lab6.exe 2
Количесво дочерних процессов равно 2.Время=Thu Jun 10 02:43:07 2004
Создался потомок номер 1.Время=Thu Jun 10 02:43:07 2004
Родитель послал число 23 потомку 1.Время=Thu Jun 10 02:43:07 2004
Потомок номер 1 получил число 23.Время=Thu Jun 10 02:43:08 2004
Родитель послал число 17 потомку 1.Время=Thu Jun 10 02:43:08 2004
Создался потомок номер 2.Время=Thu Jun 10 02:43:08 2004
Родитель послал число 35 потомку 2.Время=Thu Jun 10 02:43:08 2004
Потомок номер 2 получил число 35.Время=Thu Jun 10 02:43:09 2004
Потомок номер 1 получил число 17.Время=Thu Jun 10 02:43:10 2004
Родитель послал число 26 потомку 2.Время=Thu Jun 10 02:43:10 2004
Родитель послал число 12 потомку 1.Время=Thu Jun 10 02:43:11 2004
Потомок номер 2 получил число 26.Время=Thu Jun 10 02:43:11 2004
Родитель получил код на удаление 2.Время=Thu Jun 10 02:43:11 2004
Потомок номер 1 получил число 12.Время=Thu Jun 10 02:43:12 2004
Родитель получил код на удаление 1.Время=Thu Jun 10 02:43:12 2004
Поток номер 2 закрылся.Время=Thu Jun 10 02:43:12 2004
Поток номер 1 закрылся.Время=Thu Jun 10 02:43:13 2004
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.