Факультет Технической Кибернетики
Кафедра Компьютерных Систем и Программных Технологий
ОТЧЕТ
о выполнении научно-исследовательской работе
по дисциплине "Операционные системы и среды"
IPCPOSIX на примере QNX Neutrino:
Преподаватель Душутина Е.В.
Санкт-Петербург
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 (см. следующий фрагмент кода:
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.