//файл sigact.c
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
void (*mysig (int
sig, void (*handler) (int)))
(int) // ”надежная” обработка
//сигналов
{
struct sigaction act;
act.sa_handler = handler; //установка
обработчика сигнала sig
sigemptyset(&act.sa_mask);
//обнуление маски
sigaddset(&act.sa_mask,
SIGINT); //блокировка сигнала SIGINT
act.sa_flags = 0;
if(sigaction(sig,
&act, 0) < 0)
return (SIG_ERR);
return (act.sa_handler);
}
)
Структура sigaction имеет следующий формат:
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
}
sa_handler задает тип действий процесса (SIG_DFL, SIG_IGN или указатель на функцию обработки сигнала).
sa_mask задает маску сигналов, которые должны блокироваться при обработке сигнала.
sa_flags содержит набор флагов, которые могут влиять на поведение процесса при обработке сигнала.
2. Блокировку реализуйте, вызвав "засыпание" процесса на одну минуту из обработчика пользовательских сигналов. В основной программе установите диспозицию этих сигналов.
sigact.c
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
void (*mysig(int sig, void(*handler)(void))) (int)
{
struct sigaction act;
act.sa_handler=handler;
sigemptyset(&act.sa_mask);
sigaddset(&act.sa_mask, SIGINT);
act.sa_flags=0;
if(sigaction(sig, &act, 0) < 0)
return(SIG_ERR);
return(act.sa_handler);
}
void sigusr_1(void)
{
printf("SIGUSR1, SIGINT blocked.....\n");
sleep(20);
printf("end\n");
}
void sigusr_2(void)
{
printf("SIGUSR2, SIGINT blocked.....\n");
sleep(20);
printf("end\n");
}
int main( void )
{
mysig( SIGUSR1, sigusr_1);
mysig( SIGUSR2, sigusr_2);
while(1)
sleep(1); return;
}
Результаты:
# gcc sigact.c -o sigact
# ./sigact&
[1] 1749040
# kill -s SIGINT1
# kill -s SIGUSR1 1749040
# SIGUSR1, SIGINT blocked.....
# kill -s SIGUSR2 1749040
SIGUSR2, SIGINT blocked.....
# ps -l| grep sig
00000200 - 0 1749040 856108 - 10 0 - 636K - ? 00:0
0:00 sigact
# kill -s SIGINT 1749040
# ps -l| grep sig
00000200 - 0 1749040 856108 - 10 0 - 636K - ? 00:0
0:00 sigact
end
# kill -s SIGINT 1749040
/bin/sh: kill: 1749040: No such process
[1] + Interrupt ./sigact
# ps -l| grep sig
3. Измените обработчик так, чтобы отправка сигнала SIGINT производилась из обработчика функцией kill(SIGINT, getpid()); установив в основной программе диспозицию:
struct sigaction act, oldact;
. . .
if(sigaction(sig, &act,
&oldact) < 0)
return (SIG_ERR);
return (oldact.sa_handler);
sigact2.c
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.