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
______________