#include <signal.h>
typedef void(*sighandler_t)(int);
sighandler_t signal(int signum,sighandler_t handler);
功能:设置调用进程针对特定信号的处理方式
参数: signum 信号编号
handler 信号处理方式
SIG_IGN 忽略
SIG_DFL 默认
函数指针 捕获
返回值:成功返回原信号处理方式,如果之前未处理过则返回NULL,失败返回SIG_ERR进程正常或异常终止都会向父进程发送SIGCHLD(17)信号
fork创建的子进程,继承父进程捕获和忽略
exec创建的子进程,继承父进程忽略,不继承捕获(新代码替换旧代码,恢复默认)
kill [-信号] PID
不指定发送SIGTERM(15)信号
信号使用编号或名称可以忽略SIG,-1给系统所有进程发送9号信号
超级用户可以发送任何进程,普通用户只能发送自己进程
发送信号
#include <signal.h>
int kill (pid_t pid, int signum);
功能:向指定进程发送信号
参数:pid
-1 向系统所有进程发送信号
>0 指定(pid)发送信号
signum: 信号编号,取0检查pid是否存在,不存在kill函数返回-1,且errno为ESRCH
返回值:成功0,失败-1
#include <signal.h>
int raise (int signum);
功能:向调用函数自己发送信号
参数:signum 信号编号
返回值:成功0,失败非0
等价kill(getpid(),signum)暂停
#include <unistd.h>
int pause(void)
功能:无限睡眠
返回值:成功阻塞进程,失败-1
进程被终止或捕获返回-1且errno为EINTR表示阻塞被系统调用信号打断
信号处理函数返回(返回值)后函数才会返回(返回值)睡眠
#include <unistd.h>
unsigned int sleep(unsigned int seconds);
功能:有限睡眠
参数:seconds 秒为单位的睡眠时限
返回值:返回0或剩余秒数
如果有信号被调用进程捕获,信号处理函数返回(返回值)后函数才会返回(返回值)
#include <unistd.h>
int usleep (useconds_t usec);
功能:更精准的有限睡眠
参数:usec 以微秒为单位的睡眠时限
返回值:成功返回0,失败-1
如果有信号被调用进程捕获,信号处理函数返回(返回值)后函数才会返回(返回值),返回值和errno为EINTR表示阻塞被系统调用信号打断闹钟
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
功能:设置闹钟
参数:seconds 以秒为单位的闹钟时间。
返回值:返回0或先前所设闹钟的剩余秒数。
alarm函数使系统内核在该函数被调用后seconds秒的时候,向调用进程发送SIGALRM(14)信号
非堵塞运行,第一次设置闹钟后立即返回0(时间到后发送14信号),后续调用该函数前已设过闹钟且尚未到期,则该函数会重设闹钟,并返回先前所设闹钟的剩余秒数,否则返回0
若seconds取0,则表示取消先前设过且尚未到期的闹钟信号集
多个信号组成的信号集合是信号集
系统内核用 sigset_t 类型表示信号集
在 <signal.h> 中又被定义为 typedef __sigset_t sigset_t;
在 <sigset.h> 中有如下类型定义
#define _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int)))
typedef struct {
unsigned long int __val[_SIGSET_NWORDS];
} __sigset_t;
sigset_t 类型是一个结构体,但该结构体中只有一个成员,是一个包含32个元素的整数数组(针对32位系统而言)(从低到高,一个比特表示一个信号)#include <signal.h>
int sigfillset (sigset_t* sigset);
功能:填满信号集,将信号集的全部信号位置 1
参数:sigset 信号集
返回值:成功返回 0,失败返回 -1#include <signal.h>
int sigemptyset (sigset_t* sigset);
功能:清空信号集,将信号集的全部信号位置 0
参数:sigset 信号集
返回值:成功返回 0,失败返回 -1#include <signal.h>
int sigaddset (sigset_t* sigset, int signum);
功能:加入信号,将信号集中与指定信号编号对应的信号位置 1
参数:sigset 信号集
signum 信号编号
返回值:成功返回 0,失败返回 -1#include <signal.h>
int sigdelset (sigset_t* sigset, int signum);
功能:删除信号,将信号集中与指定信号编号对应的信号位置 0
参数:sigset 信号集
signum 信号编号
返回值:成功返回 0,失败返回 -1#include <signal.h>
int sigismember (const sigset_t* sigset, int signum);
功能:判断信号集中是否有某信号,即检查信号集中与指定信号编号对应的信号位是否为 1
参数:sigset 信号集
signum 信号编号
返回值:有则返回 1,没有返回 0,失败返回 -1信号屏蔽
#include <signal.h>
int sigprocmask(int how, const sigset_t* sigset, sigset_t* oldset);
功能:设置/修改调用进程的信号掩码
参数:how:修改信号掩码的方式
SIG_BLOCK 将 sigset 中的信号加入当前信号掩码
SIG_UNBLOCK 从当前信号掩码中删除 sigset 中的信号
SIG_SETMASK 把 sigset 设为当前信号掩码
set:信号集,取 NULL 则忽略此参数
oldset:输出原信号掩码,取 NULL 则忽略此参数
返回值:成功返回 0,失败返回 -1#include <signal.h>
int sigpending(sigset_t* sigset);
功能:获取调用进程的未决信号集
参数:sigset:输出未决信号集
返回值:成功返回 0,失败返回 -1