IPCPOSIX на примере QNX Neutrino (Отчет о выполнении научно-исследовательской работы)

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

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

Санкт-Петербургский Государственный Политехнический Университет

Факультет Технической Кибернетики

Кафедра Компьютерных Систем и Программных Технологий

ОТЧЕТ

о выполнении научно-исследовательской работе

по дисциплине "Операционные системы и среды"

IPCPOSIX на примере QNX Neutrino:

                              Работу выполнила студентка группы 4081/1    Донцова А.В.

Преподаватель                                                  Душутина Е.В.

Санкт-Петербург

2011

I. “Ненадежные” сигналы

Составьте программу sig_father.c, позволяющую изменить диспозицию сигналов, а именно,  установить:
- обработчик пользовательских сигналов SIGUSR1 и SIGUSR2;
- реакцию по умолчанию на сигнал SIGINT;
- игнорирование сигнала SIGCHLD;
породить процесс-копию и уйти в ожидание сигналов.
Обработчик сигналов должен содержать восстановление диспозиции и оповещение на экране о (удачно или неудачно) полученном сигнале и идентификаторе родительского процесса.
Процесс-потомок, получив идентификатор родительского процесса, посылает процессу-отцу сигнал SIGUSR1 и извещает об удачной или неудачной отправке указанного сигнала. Остальные сигналы генерируются из командной строки.

sig_father.c

#include <signal.h>

#include <stdio.h>

#include <process.h>

void sigusr_1( void );

void sigusr_2( void );

int main()

{

      signal( SIGUSR1, sigusr_1 );

      signal( SIGUSR2, sigusr_2 );

      signal( SIGINT, SIG_DFL );

      signal( SIGCHLD, SIG_IGN );

      spawnl( P_NOWAIT, "sig_son", "sig_son", NULL );

      while(1)

                  sleep(1);

      return 0;

}

void sigusr_1( void )

{

      printf("\n father <--- SIGUSR1  \n");

      printf("father's pid: %i \n",getpid());

}

void sigusr_2( void )

{

      printf("\n  father <--- SIGUSR2  \n");

}

sig_son.c

#include <signal.h>

#include <stdio.h>

#include <sys/types.h>

#include <process.h>

int main()

{

      if( kill( getppid(), SIGUSR1 ) == -1 )

            printf("\n ERROR SIGUSR1 \n");

      else

            printf("\n son ---> SIGUSR1\n");

      return 0;

}

Результаты:

# gcc sig_father.c -o sig_father

# gcc sig_son.c -o sig_son

# ./sig_father&

[1] 1024054

#

 son ---> SIGUSR1

 father <--- SIGUSR1

 father's pid: 1024054

# kill -s SIGUSR2 1024054

#   father <--- SIGUSR2

# kill -s SIGCHLD 1024054

# ps | grep father

      1024054 ?        00:00:00 sig_father

# kill -s SIGINT 1024054

# ps | grep father

   [1] + Interrupt            ./sig_father

#

В результате исполнения программы отправленный дочерним процессом сигнал пришел отцу (отобразилось выполнение обработчиков). При отправке из терминала сигнала SIGUSR2, был выполнен его обработчик, при отправке SIGCHLD (изменении статуса дочернего процесса) ничего не произошло, этот сигнал проигнорирован, при отправке SIGINT (остановка процесса пользователем с терминала), процесс был остановлен.

II. “Надежные” сигналы

1. Составьте программу sigact.c, позволяющую заблокировать сигнал SIGINT.
Вся необходимая для управления сигналами информация передается через указатель на структуру sigaction (см. следующий фрагмент кода:

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

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