本节使用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