Межпроцессные коммуникации - каналы и сигналы

Страницы работы

Содержание работы

Министерство Образования Российской Федерации

Хабаровский Государственный Технический Университет

Подпись: 	Кафедра ВТ
 


Лабораторная работа №6

По дисциплине «Операционные системы»

Подпись: Хабаровск 2004Подпись: Выполнили:	студенты гр. ВМ-11
Федюнин А.С.
Тростьянов В.В.
Проверил:	преподаватель Сорокин Н.Ю.

Тема: «Межпроцессные коммуникации - каналы и сигналы»Цель работы:Изучение средств межпроцессных коммуникаций, предоставляемых ОС Linux, на примере неименованных каналов. Знакомство с сигналами ОС и с функциями для работы с ними.

Задание:

Реализуйте следующий сценарий. Родительский процесс создает одинаковые дочерние процессы, которые работают параллельно и выполняют какие-либо действия за случайный интервал времени. Родительский процесс и дочерние процессы общаются (предают друг другу сообщения) через каналы. При наступлении какого-либо события в дочернем процессе, этот процесс оповещает сигналом родительский процесс, который после обработки данного сигнала завершает этот дочерний процесс. После завершения всех дочерних процессов родительский процесс завершает свою работу. На время работы программы необходимо запретить прерывание программы по Ctrl-C. Количество дочерних процессов должно задаваться с командной строки. Все процессы должны выводить на экран сообщения о своей работе и время сообщения.

Пример работы дочернего процесса: генерация случайных чисел (или символьных последовательностей) в зависимости от принятых данных от родительского процесса.

Событие: сумма чисел (или длина последовательности) становится больше какой-либо константы.

Текст и результат работы программы:

Листинг программы:

#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

Похожие материалы

Информация о работе

Тип:
Отчеты по лабораторным работам
Размер файла:
49 Kb
Скачали:
0