SIGCHLD信号与SIG_IGN处理的使用
来源:互联网 发布:北电网络 编辑:程序博客网 时间:2024/05/11 17:47
转自:
1) http://blog.csdn.net/liuchao1986105/article/details/6440896
2) http://blog.csdn.net/u013246898/article/details/52985739
1)signal(SIGCHLD, SIG_IGN); //忽略SIGCHLD信号,这常用于并发服务器的性能的一个技巧
//因为并发服务器常常fork很多子进程,子进程终结之后需要
//服务器进程去wait清理资源。如果将此信号的处理方式设为
//忽略,可让内核把僵尸子进程转交给init进程去处理,省去了
//大量僵尸进程占用系统资源。(Linux Only)
//因为并发服务器常常fork很多子进程,子进程终结之后需要
//服务器进程去wait清理资源。如果将此信号的处理方式设为
//忽略,可让内核把僵尸子进程转交给init进程去处理,省去了
//大量僵尸进程占用系统资源。(Linux Only)
some code();
pid = fork(); //生成一个子进程
if (pid < 0) // error check.
handle_err();
if (pid < 0) // error check.
handle_err();
if (pid == 0)
exit (execl(....)); // child process.
else
if (wait(&ret) < 0)
perror(/"wait/"); //parent process
//在这里wait,都会得No Such process的错误,
//因为子进程终止后,内核会向父进程发送SIGCHLD
//信号,但是上面已将此信号设为忽略,实质上由
//init来接收此子进程的处理。
exit (execl(....)); // child process.
else
if (wait(&ret) < 0)
perror(/"wait/"); //parent process
//在这里wait,都会得No Such process的错误,
//因为子进程终止后,内核会向父进程发送SIGCHLD
//信号,但是上面已将此信号设为忽略,实质上由
//init来接收此子进程的处理。
对于某些进程,特别是服务器进程往往在请求到来时生成子进程处理请求。如果父进程不等待子进程结束,子进程将成为僵尸进程(zombie)从而占用系统资源。如果父进程等待子进程结束,将增加父进程的负担,影响服务器进程的并发性能。在Linux下可以简单地将 SIGCHLD信号的操作设为SIG_IGN。
signal(SIGCHLD,SIG_IGN);
这样,内核在子进程结束时不会产生僵尸进程。这一点与BSD4不同,BSD4下必须显式等待子进程结束才能释放僵尸进程。
2)我们调用fork函数派生一个子进程后,当子进程快要结束,会向父进程发送一个SIGCHLD信号,告诉父进程我快结束,赶快调用wait函数,来回收子进程的退出状态和其他信息。
这就是一种我们通常来预发僵尸进程产出的方法,在父进程接收到SIGCHLD信号后,将默认行为改为wait来回收子进程的信息。如果父进程没有调用wait函数,子进程先于父进程退出,则子进程将成为僵尸进程。
但是wait函数需要阻塞父进程直到子进程结束为止,对于并发要求较高的并发服务器,可能就不是很适用。
这里就引出第二种解决僵尸进程的方法,将僵尸进程交给init进程来领养,回收子进程退出状态和其他信息。当我们忽略SIGCHLD信号,内核将把僵尸进程交由init进程去处理,能够省去大量僵尸进程占用系统资源。
即调用: signal(SIGCHLD, SIG_IGN)
阅读全文
0 0
- SIGCHLD信号与SIG_IGN处理的使用
- SIGCHLD信号与SIG_IGN处理的使用
- SIGCHLD信号与SIG_IGN处理的使用
- SIGCHLD信号与SIG_IGN处理的使用
- SIGCHLD信号与SIG_IGN处理的使用
- SIGCHLD信号与SIG_IGN处理的使用
- SIGCHLD信号与SIG_IGN处理的使用
- SIGCHLD信号与SIG_IGN处理的使用
- 嵌入式 SIGCHLD信号与SIG_IGN处理的使用示例
- 关于SIGCHLD信号的处理
- 关于SIGCHLD信号的处理
- 关于SIGCHLD与SIG_IGN应用。
- linux信号函数signal(SIGCHLD, SIG_IGN)
- SIGCHLD信号处理
- 总结别人的结果,sigchld信号处理,和close与shutdown的区别
- linux下同时使用wait和SIGCHLD的信号处理函数
- linux的SIGCHLD信号
- 使用waitpid函数处理SIGCHLD信号-避免僵死进程
- springboot+rabbitmq整合示例程
- maven打包jar上传远程仓库
- 腾讯暑期实习生一面
- 编程之战第二章 斐波那契
- 数组-第四天
- SIGCHLD信号与SIG_IGN处理的使用
- jenkins+git+maven+shell构建自动化部署项目
- sql之left join、right join、inner join的区别
- 分组
- Java并发编程之CyclicBarrier
- Display中getHeight()和getWidth() 官方废弃
- textview显示字数的问题或者是限制显示多少行,超过用省略号表示
- Intellij idea编译报错: javacTask: 源发行版 1.7 需要目标发行版 1.7
- 类和对象-第五天