6.11 通过文件描述符来获取信号
从内核2.6.22版本开始,Linux提供了另外一种机制来接收信号:通过文件描述符来获取信号即signalfd机制。
这个机制和sigwaitinfo非常地类似,都属于同步等待信号的范畴,都需要首先调用sigprocmask将关注的信号屏蔽,以防止被信号处理函数劫走。
不同之处在于,文件描述符方法提供了文件系统的接口,可以通过select、poll和epoll来监控这些文件描述符。
signalfd接口的定义如下:
int signalfd(int fd, const sigset_t *mask, int flags);
其中,mask参数是信号集,表示关注信号的集合。
这些信号的集合应该在调用signalfd函数之前,先调用sigprocmask函数阻塞这些信号,以防止被信号处理函数劫走。
首次创建时fd参数应该为-1,该函数会创建一个文件描述符,用于读取mask中到来的信号。
如果fd不是-1,则表示是修改操作,一般是修改mask的值,此时fd是之前调用signalfd时返回的值。
第三个参数flags用来控制行为,目前支持的标志位如下。
- SFD_CLOEXEC:和普通文件的O_CLOEXEC一样,调用exec函数时,文件描述符会被关闭。
- SFD_NONBLOCK:控