关于使用sigsuspend(sigset_t* mask)阻塞进程
2013-12-16 06:46
387 查看
sigsuspend的定义:http://man7.org/linux/man-pages/man2/sigsuspend.2.html
参考博文:http://www.tuicool.com/articles/673M3q
个人Note:
sigsuspend temperately replaces the calling process's signal set with its argument mask.
mask中被set了的信号则会被阻塞,进程永远都接收不到。(i.e. 若sigfillset(&mask)的话,则一个信号都收不到)。在暂时替换了当前进程的signal set后,当前进程被挂起,直到有signal(前提是没被block掉的)触发signal_handler或者把当前进程终结,才会恢复运行当前进程。
所以,多种信号如SIGINT、SIGTSTP都可以使进程停止挂起。假如我们仅仅想等待SIGCHLD信号,但同时又不想block掉SIGINT和STGTSTP信号,则只能额外加一个flag,并做如下处理:
while(!sigchld_received) {
sigsuspend(&mask);
}
...
sigchld_handler(int sig) {
...
sigchld_received = 1;
...
}
这样一来,parent进程便会一直等待,直到sigchld_handler被触发(即child进程终结或被停止)。
P.S. 当调用sigsuspend进行等待时,signal handler都是由sigsuspend函数内部调用的!(参考顶上的博文链接)
【本文是从我原来的新浪博客搬过来的笔记】
参考博文:http://www.tuicool.com/articles/673M3q
个人Note:
sigsuspend temperately replaces the calling process's signal set with its argument mask.
mask中被set了的信号则会被阻塞,进程永远都接收不到。(i.e. 若sigfillset(&mask)的话,则一个信号都收不到)。在暂时替换了当前进程的signal set后,当前进程被挂起,直到有signal(前提是没被block掉的)触发signal_handler或者把当前进程终结,才会恢复运行当前进程。
所以,多种信号如SIGINT、SIGTSTP都可以使进程停止挂起。假如我们仅仅想等待SIGCHLD信号,但同时又不想block掉SIGINT和STGTSTP信号,则只能额外加一个flag,并做如下处理:
while(!sigchld_received) {
sigsuspend(&mask);
}
...
sigchld_handler(int sig) {
...
sigchld_received = 1;
...
}
这样一来,parent进程便会一直等待,直到sigchld_handler被触发(即child进程终结或被停止)。
P.S. 当调用sigsuspend进行等待时,signal handler都是由sigsuspend函数内部调用的!(参考顶上的博文链接)
【本文是从我原来的新浪博客搬过来的笔记】
相关文章推荐
- 关于QMessageBox阻塞进程的处理方法
- 为什么sigsuspend要与sigprocmask配合使用?
- 关于Spring Batch 执行系统命令时进程阻塞的问题
- 【C】——sigprocmask 阻塞进程信号
- 关于回调函数、共享内存的使用,以及进程间函数调用的讨论
- 关于IIS服务启动失败的问题:“IIS提示‘另一个程序正在使用此文件,进程无法访问’”,的解决方法
- 关于进程内存使用的一点学习和实践
- Python异步非阻塞IO多路复用Select/Poll/Epoll使用,线程,进程,协程
- 阿里云被挖矿使用,导致cpu长期处于100%,ddgs进程,xWx3T进程,关于redis密码
- 关于使用UDP套接字进行本地进程间…
- 为什么sigsuspend要与sigprocmask配合使用?
- 关于Unity3d中的LayerMask使用 .
- 关于使用线程池造成tomcat进程无法正常退出的一点思考
- sigprocmask 阻塞进程
- 函数sigsuspend sigprocmask的使用
- 关于.NET程序中使用Excel对象后,如何结束残留的Excel进程
- 进程的信号掩码【sigprocmask(int what,const sigset_t *set,sigset_t *oldset)】
- 信号阻塞与屏蔽:SIG_BLOCK, SIG_UNBLOCK, SIG_MASK区别与使用
- 关于跨进程使用回调函数的研究:以跨进程获取Richedit中RTF流为例(在Delphi 初始化每一个TWinControl 对象时,将会在窗体 的属性(PropData)中加入一些标志,DLL的HInstance的值与HOST 进程的HInstance并不一致)