信号函数
signal系统调用
要为一个信号设置处理函数,可以使用下面的signal系统调用:
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
signum参数指出要捕获的信号类型。handler参数是sighandler_t类型的函数指针,用于指定信号sig的处理函数。
signal函数成功时返回一个函数指针,该函数指针的类型也是sighandler_t。这个返回值是前一次调用signal函数时传入的函数指针,或者是信号signum对应的默认处理函数指针SIG_DFL(如果是第一次调用signal的话)。
signal系统调用出错时返回SIG_ERR,并设置errno。
sigaction系统调用
设置信号处理函数的更健壮的接口是如下的系统调用:
#include <signal.h>
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
signum参数指出要捕获的信号类型,act参数指定新的信号处理方式,oldact参数则输出信号先前的处理方式(如果不为NULL的话)。act和oldact都是sigaction结构体类型的指针,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成员指定信号处理函数。sa_mask成员设置进程的信号掩码(确切地说是在进程原有信号掩码的基础上增加信号掩码),以指定哪些信号不能发送给本进程。sa_mask是信号集sigset_t类型,该类型指定一组信号。sa_flags成员用于设置程序收到信号时的行为。sa_restorer成员已经过时,最好不要使用。sigaction成功时返回0,失败时返回-1并设置errno。