信号用于通知进程发生了某件事情,可以由一个进程发给另一个进程,也可以由内核发个一个进程。
每个信号都有一个关联的行为,可以通过sigaction函数来设置一个信号的行为,有3种选择:
1、定义一个信号处理函数捕获信号,在信号发生时被调用。SIGKILL和SIGSTOP信号不能捕获
信号处理函数原型:void handler (int signo)
2、忽略信号,即把信号的行为设定为SIG_IGN,同样SIGKILL和SIGSTOP信号不能忽略
3、缺省行为,即把信号行为设定为SIG_DFL
signal函数:标准C的信号接口
void ( *signal (int signo, void (*func) (int)) ) (int)
加粗部分是函数名和参数列表,没加粗部分是函数的返回类型,返回一个参数是int,没有返回值的函数指针。
第一个参数是信号名,第二个参数是指向信号处理函数的指针,或为常值SIG_IGN或SIG_DFL
sigaction函数:POSIX标准信号接口
int sigaction (int signo, const struct sigaction *act, sigaciton *oact)
参数act定义了信号的行为
函数把信号先前的行为保存到参数oact所指的位置
struct sigaction {
union{
__sighandler_t sa_handler; //SIG_IGN或SIG_DFL
void (*_sa_sigaction)(int,struct siginfo *, void *); //信号处理函数指针
}_u
sigset_t sa_mask; //该信号集中的信号被加入到进程的信号屏蔽字中,这些信号发生时会被阻塞而不会传递给进程
unsigned long sa_flags; //通过设置标志来控制信号处理函数的相关操作
void (*sa_restorer)(void); //暂没使用
}
SIGCHLD信号的处理
一个进程终止时,会向它的父进程发送一个SIGCHLD信号
多进程程序中,如果有子进程处于僵死状态,会造成资源的浪费,所以需要捕获SIGCHLD信号,在信号处理函数中调用wait或者waitpid函数
处理僵死进程。
在网络程序中,捕获信号可能会中断系统调用。在系统调用被中断,且信号处理函数返回时,系统调用可能返回一个EINTR错误记录在errno中,
可以利用EINTR错误重启系统调用
SIGPIPE信号
当进程向一个已收到RST的套接口写数据时,内核向进程发送一个SIGPIPE信号,缺省行为是终止进程。所以进程有必要捕获这个信号,定义
想要的行为。