随着事情的发展,旧问题很可能会得到新的答案,现在可以使用新技术 更好地 处理线程中的信号。
从Linux内核2.6.22开始,该系统提供了一个称为的新功能,该功能
signalfd()可用于为给定的Unix信号集(完全杀死进程的信号)打开文件描述符。
// defined a set of signalssigset_t set;sigemptyset(&set);sigaddset(&set, SIGUSR1);// ... you can add more than one ...// prevent the default signal behavior (very important)sigprocmask(SIG_BLOCK, &set, nullptr);// open a file descriptor using that set of Unix signalsf_socket = signalfd(-1, &set, SFD_NonBLOCK | SFD_CLOEXEC);
现在,您可以使用
poll()或
select()函数沿您正在监听的更常用的文件描述符(套接字,磁盘上的文件等)监听信号。
如果您想要一个可以一遍又一遍地检查信号和其他文件描述符的循环,则NONBLOCK很重要(即,在其他文件描述符上也很重要)。
我有一个这样的实现,可以与(1)计时器,(2)套接字,(3)管道,(4)Unix信号,(5)常规文件一起使用。实际上,实际上任何文件描述符加上计时器。
https://github.com/m2osw/snapcpp/blob/master/snapwebsites/libsnapwebsites/src/snapwebsites/snap_communicator.cpp
https://github.com/m2osw/snapcpp/blob/master/snapwebsites/libsnapwebsites/src/snap
/snap_communicator.h
您可能也对libevent等库感兴趣
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)