本节使用sigaction安装信号。关于sigaction函数,说明如下:
#include <signal.h> int sigaction(int sig, const struct sigaction *restrict act, struct sigaction *restrict oact);
参数说明:
1)sig: 输入参数,指定要安装的信号
2)act: 输入参数,指定安装信号的数据结构。该参数是一个struct sigaction类型的结构指针。结构体定义位于头文件<bits/sigaction.h>中,定义如下:
/* Structure describing the action to be taken when a signal arrives. */ struct sigaction { /* Signal handler. */ #ifdef __USE_POSIX199309 union { /* Used if SA_SIGINFO is not set. */ __sighandler_t sa_handler; /* Used if SA_SIGINFO is set. */ void (*sa_sigaction) (int, siginfo_t *, void *); } __sigaction_handler; # define sa_handler __sigaction_handler.sa_handler # define sa_sigaction __sigaction_handler.sa_sigaction #else __sighandler_t sa_handler; #endif /* Additional set of signals to be blocked. */ __sigset_t sa_mask; /* Special flags. */ int sa_flags; /* Restore handler. */ void (*sa_restorer) (void); };
2)该结构是sigaction的核心,结构成员说明如下:
_sigaction_handler: 用于定义信号的处理函数,实际上是指向信号处理函数的指针。可以看出该成员是一个联合类型。一种是与signal调用相同的处理函数,其类型为 _sighandler_t,这种类型的函数只有一个输入参数,即信号值;另一种则是被sigaction系统调用所支持的函数,该函数的声明是:void (*sa_sigaction)(int, siginfo_t *, void *)。
sa_mask: 信号掩码。在信号处理函数执行的过程中,在该掩码中定义的信号将被阻塞。
sa_flags: 标志位。sigaction支持若干标志位,主要的有SA_SIGINFO、SA_RESTART参数等。其中SA_SIGINFO标志标明该信号在发送时可以附带其他数据; SA_RESTART参数标明如果信号中断了进城的某个系统调用,则由系统自动重启该系统调用。如果不指定该参数,则被中断的系统调用将返回失败,错误码为 EINTR。
_oact: 输出参数, 指向struct sigaction 结构的指针。调用sigaction成功后, 该系统中将返回信号的原来处理方式。如果不需要获取原信号处理方式,则该参数可以传入 NULL。
3)返回值说明:
0:调用成功;
-1: 调用失败,可以查看errno获取错误信息。
代码示例:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <signal.h> void HandleSigint(int signo, siginfo_t *info, void *none) { printf("receive signal %d, addtional data is %d\n", signo, info->si_value.sival_int); } int main(void) { struct sigaction act, oact; memset(&act, 0x00, sizeof(struct sigaction)); sigemptyset(&act.sa_mask); act.sa_sigaction = HandleSigint; act.sa_flags = SA_SIGINFO; if (sigaction(SIGINT, &act, &oact) == -1) { perror("sigaction"); exit(0); } pause(); return 0; }
运行结构:
[root@localhost linuxc]# ./mysigaction <-输入<CTRL>+<C> receive signal 2, addtional data is 0