[Linux]关于SIGCHLD
来源:互联网 发布:淘宝美胸第一名 编辑:程序博客网 时间:2024/05/19 02:39
之前我们就学过,关于wait和waitpid来处理僵尸进程,父进程等待子进程结束后自己才退出,这样的方法有俩种方式,一种是父进程死死的等子进程退出,也就是使用阻塞的方式等待子进程退出,另一种方式是通过非阻塞的方式,即轮询的方式,这样父进程就可以不用浪费时间一直在那里等子进程退出,而是可以自己干自己的事,过段时间访问一次看子进程退出没,没退出的话干自己的,退出的话则回收子进程,并且自己也随即退出。那么我们是如何知道子进程是否退出呢。其实在这里,子进程终止后会给父进程发送一个SIGCHLD信号,很多同学会想,也没有见过这个信号呀,是因为这个信号的处理方式操作系统默认为忽略的方式处理的,如果你想要知道那个信号,那就用我们学过的让它的处理方式为用户自定义的处理函数即可啦。下面编写一个代码来验证一下子进程终止确实是会给父进程发送SIGCHLD信号的。
#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<signal.h>void myhandler(int sig){ printf("my sig is %d\n",sig);}int main(){ pid_t id = fork(); signal(SIGCHLD,myhandler); if(id == 0)//child { printf("i am child!pid:%d\n",getpid()); sleep(5); exit(1); } else //father { while(id = waitpid(id,NULL,0) > 0) { printf("wait child success:%d pid:%d\n",id,getpid()); } printf("child is quit!%d\n",getpid()); } return 0;}
运行结果:
等待子进程5秒之后:(发送了一个信号17)
我们可以看一下这个17号信号是什么:(kill -l命令)
对,就是那个SIGCHLD信号。
我们之前用sigaction来捕捉信号,当然我们也可以使用sigaction来捕捉SIGCHLD信号,在这里对于这个例子来说也叫做父进程等待子进程的异步版本,具体实现如下:
#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<signal.h>void myhandler(int sig){ printf("my sig is %d\n",sig);}int main(){ signal(SIGCHLD,myhandler); pid_t cid; if((cid = fork())== 0)//child { printf("i am child!pid:%d\n",getpid()); sleep(5); exit(1); } else { struct sigaction act; act.sa_handler = myhandler; sigemptyset(&act.sa_mask); act.sa_flags = 0; sigaction(SIGCHLD,&act,NULL); while(1) { printf("i am parent,my pid is %d\n",getpid()); sleep(1); } }// else //father// {// while(id = waitpid(id,NULL,0) > 0)// {// printf("wait child success:%d pid:%d\n",id,getpid());// }// printf("child is quit!%d\n",getpid());// } return 0;}
运行结果:
当子进程运行5秒后,sigaction函数捕捉到SIGCHLD信号,也即子进程退出的信号,然后父进程运行。
阅读全文
0 0
- [Linux]关于SIGCHLD
- 关于linux环境下信号SIGCHLD的排队机制
- 关于信号signal()、SIGCHLD......
- 关于SIGCHLD信号问题
- 关于SIGPIPE、SIGCHLD
- 【信号】---关于SIGCHLD信号
- linux的SIGCHLD信号
- 关于SIGCHLD信号的处理
- 关于SIGCHLD与SIG_IGN应用。
- 关于SIGCHLD信号的处理
- SIGCHLD
- Linux下的SIGCHLD信号
- 关于SIGCHLD的几点讨论
- Linux信号处理之阻塞,SIGCHLD
- linux信号函数signal(SIGCHLD, SIG_IGN)
- 关于SIGCHLD的不排队,丢弃的问题
- 关于子进程异步等待方式(SIGCHLD信号)
- Linux中的SIGCHLD及wait,waitpid的使用
- Hive分区、分桶操作及其比较(转自:http://blog.csdn.net/epitomizelu/article/details/41911657)
- Javascript之函数(基础篇)
- 分布式数据库学习--分布式并发控制
- Apache SolrTM 5.3.1 Documentation
- 对称加密与非对称加密笔记_one
- [Linux]关于SIGCHLD
- Android 布局2
- c语言基础(五)多级指针
- webpack相关学习资源
- C++搜索与回溯算法之棋盘问题
- C++中结构体与类的区别(struct与class的区别)
- 笔记4
- 如何避免死锁
- 给ueditor增加删除文件功能