1.信号
#include <sys/types.h> #include <signal.h> //把信号sig发送给目标进程 // sig:信号;pid:目标进程 int kill(pid_t pid, int sig); // 该函数成功时返回0,失败时返回-1并设置errno
2.信号处理方法
#include <signal.h> // 目标进程在收到信号时,需要定义一个接收函数来处理,其原型为: typedef void (*__sighandler_t)(int);
信号处理函数只能带一个整型参数,该参数用来指示信号类型。信号处理函数应该是可冲入的,否则容易引发竞态条件。
#include <bits/signum.h> // 其他两种处理方式 // SIG_IGN忽略目标信号;SIG_DFL使用信号的默认处理方式 #define SIG_DFL ((__sighandler_t) 0) #define SIG_IGN ((__sighandler_t) 1)
SIG_IGN忽略目标信号;SIG_DFL使用信号的默认处理方式
SIG_IGN表示忽略目标信号,SIG_DFL表示使用信号的默认处理方式。信号的默认处理方式有如下几种:结束进程(Term)、忽略信号(Ign)、结束进程并生成核心转储文件(Core)、暂停进程( Stop),以及继续进程(Cont)。
3.Linux信号
SIGHUP 控制终端挂起
SIGPIPE 往读端被关闭的管道或者socket连续中写数据
SIGURG socket连接上接收到紧急数据
SIGALRM 由alarm或setitimer设置的实时闹钟超时引起
SIGCHLD 子进程状态发送变化(退出或者暂停)
4.中断系统调用
如果程序在执行处于阻塞状态的系统调用时接收到信号,并且我们为该信号设置了信号处理函数,则默认情况下系统调用将被中断,并且errno被设置为EINTR。我们可以使用sigaction函数(见后文)为信号设置SA_RESTART标志以自动重启被该信号中断的系统调用。 对于默认行为是暂停进程的信号(比如SIGSTOP、SIGTTIN),如果我们没有为它们设置信号处理函数,则它们也可以中断某些系统调用(比如connect、epoll_wait)。POSIX没有规定这种行为,这是Linux独有的。
4 信号函数
4.1signal系统调用
#include <signal.h> // sig:指出要捕获的信号类型,_handler用于指定信号sig的处理函数 _sighandler_t signal(int sig, _sighandler_t _handler); // 成功时返回类型为_sighandler_t的函数指针,错误返回SIG_ERR并设置errno
4.2sigaction系统调用
#include <signal.h> // 更健壮的信号处理函数接口 // sig:要捕获的信号类型;act:制定新的信号处理方式;oact:输出信号前的处理方式 int sigaction(int sig, const struct sigaction* act, struct sigaction* oact); // sigaction结构体定义: struct sigaction{ #ifdef __USE_POSIX199309 union{ _sighandler_t sa_handler; void(*sa_sigaction)(int, siginfo_t*, void*); } _sigaction_handler; # define sa_handler __sigaction_handler.sa_handler # define sa_sigaction __sigatcion_handler.sa_sigaction #else _sighandler_t sa_handler; //信号处理函数 #endif _sigset_t sa_mask;//信号掩码 int sa_flags;//收到信号的行为 //void(*sa_restorer)(void); 过时了 };