Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab7OS.doc
Скачиваний:
11
Добавлен:
01.03.2016
Размер:
72.19 Кб
Скачать

7.3 Текст программы

Вариант 2.

Перехватывать 2, 13, 21.

Маскировать – 1.

Не восстанавливать реакцию по умолчанию при получении – 2.

Разрешить получение сигнала внутри его обработчика – 2, 21.

Не разрешать получение сигнала внутри его обработчика – 13.

Текс программы приведен ниже:

#include <stdio.h>

#include <signal.h>

void* funcInit(int sig);

void func(int sig,siginfo_t* sinfo,void *_addinfo){ //функция обработчик сигнала

switch (sig){

case SIGINT:{ //2

printf("Signal catch = %d",sinfo->si_signo);

printf("\nSignal info:\n______________\n");

printf("numb:\t %d (%d)\n",sinfo->si_signo, sig);

printf("pid:\t %d\n", sinfo->si_pid);

printf("uid:\t %d\n ", sinfo->si_uid);

raise(SIGINT);

printf("Signal %d block \n",sinfo->si_signo);

printf(" ______________\n");

signal(SIGINT,funcInit);

break;

}

case SIGPIPE:{ //13

printf("Signal catch = %d",sinfo->si_signo);

printf("\nSignal info:\n______________\n");

printf("numb:\t %d (%d)\n",sinfo->si_signo, sig);

printf("pid:\t %d\n", sinfo->si_pid);

printf("uid:\t %d\n ", sinfo->si_uid);

signal(SIGPIPE,SIG_IGN);

raise(SIGPIPE);

printf("Signal %d block \n",sinfo->si_signo);

printf(" ______________\n");

signal(SIGPIPE,funcInit);

break;

}

case SIGTTIN:{ //21

printf("Signal catch = %d",sinfo->si_signo);

printf("\nSignal info:\n______________\n");

printf("numb:\t %d (%d)\n",sinfo->si_signo, sig);

printf("pid:\t %d\n", sinfo->si_pid);

printf("uid:\t %d\n ", sinfo->si_uid);

raise(SIGTTIN);

printf("Signal %d block \n",sinfo->si_signo);

printf(" ______________\n");

signal(SIGTTIN,funcInit);

break;

}

}

}

void* funcInit(int sig){ // функция для запрета восстановления обработчика

struct sigaction _act; // сигнала по умолчанию

switch (sig){

case SIGINT:{ //2

_act.sa_sigaction=func;

_act.sa_flags=SA_SIGINFO;

sigaction(SIGINT,&_act,NULL);

break;

}

}

}

int main(){

struct sigaction act;

sigset_t set;

sigemptyset(&set);

sigaddset(&set,SIGHUP); //маскируем первый сигнал

act.sa_flags=SA_SIGINFO;

act.sa_sigaction=func;

sigaction(SIGINT,&act,0);

sigaction(SIGPIPE,&act,0);

sigaction(SIGTTIN,&act,0);

sigprocmask(SIG_BLOCK,&set,0);

printf("Pid = %d\n",getpid());

printf("Signal uses :{1,2,13,21}\n");

raise(SIGTTIN);

raise(SIGINT);

raise(SIGPIPE);

raise(SIGHUP);

return 0;

}

7.4 Тестирование программы

Ниже приведен результат работы программы согласно 2 варианту.

vlad@vlad-HP-Pavilion ~/Documents/kurs $ ./a.out

Pid = 3132

Signal uses :{1,2,13,21}

Signal catch = 21

Signal info:

______________

numb: 21 (21)

pid: 3132

uid: 1000

Signal 21 block

______________

Signal catch = 2

Signal info:

______________

numb: 2 (2)

pid: 3132

uid: 1000

Signal 2 block

______________

Signal catch = 13

Signal info:

______________

numb: 13 (13)

pid: 3132

uid: 1000

Signal 13 block

______________

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]