一个特殊的信号---- SIGCHILD
来源:互联网 发布:同城交友网络 编辑:程序博客网 时间:2024/05/22 13:00
这里重点提一下SIGCHLD信号(17号信号),对于父进程而言,一般要对它的子进程进行等待,以防止子进程变为僵尸进程,而导致内存泄漏问题,但是对于父进程的等待方式存在两种:阻塞式等待和非阻塞式等待,可以通过wait和waitpid这两个系统调用来实现,对于父进程而言,阻塞式等待让父进程停下自己手头上的事情,专心的等待子进程退出,这严重影响了父进程的工作;而对于非阻塞式等待,父进程每隔一段时间都要轮循一下,看看子进程有没有退出,这也让我们的程序变的复杂,所以我们就想能不能让父进程对于子进程的等待变成子进程退出了就通知父进程进行回收,也就是让对子进程的等待变成异步等待,不干扰父进程的正常工作呢?
这里就得了解一下父进程是如何知道子进程已经退出的,也就是我们的SIGCHLD这个信号的作用,当子进程退出时,会向父进程发送SIGCHLD信号,而父进程就是根据是否收到这个信号来判断子进程是否退出的,所以我们可以编写如下的子进程异步等待方式:
#include<stdio.h>#include<signal.h>#include<sys/wait.h>#include<sys/types.h>#include<stdlib.h>void handler(int sig){ do{ pid_t ret; if((ret=waitpid(-1,NULL,WNOHANG))>0) //-1---表示对任意进程进行等待,以非阻塞方式加轮循,应对同一时间多个子进程退出 { printf("wait scuess,pid is %d\n",ret); } else { printf("no child exit now\n"); break; } }while(1);}int main(){ signal(SIGCHLD,handler); pid_t pid=fork(); if(pid>0) { while(1) { printf("the parent is doing...\n",pid); sleep(1); } } else { printf("the child pid is %d\n",getpid()); sleep(3); exit(1); } return 0;}除了这种异步等待的解决办法,其实还可以将SIGCHLD信号的默认动作修改成SIG_IGN,这样一来在子进程退出之时,就会自动将资源进行释放,不会产生僵尸进程,但是这种方法对于Linux有效,对于别的Unix系统不一定有效
阅读全文
0 0
- 一个特殊的信号---- SIGCHILD
- 信号: SIGCHILD
- waitpid(or wait)和SIGCHILD的关系
- Linux下信号种类以及特殊信号的含义
- tcp客户/服务器回射程序之二-----处理SIGCHILD信号
- 一个特殊的函数
- 一个特殊的错误
- 一个信号相关的代码
- 很特殊的一个activex
- 今天一个特殊的日子
- C++一个特殊的引用
- 一个特殊的HTML标签
- shmid_ds 一个特殊的数据结构
- IOS:一个特殊的语法@[]
- 求一个特殊的三位数
- shmid_ds 一个特殊的数据结构
- 一个特殊的四位数
- String,一个特殊的类
- acccheck
- DB2建库报错-SQL1052N 数据库路径不存在(Windows)
- Codeforces 844B Rectangles
- Java集合汇总
- php 二维数组根据字段值排序
- 一个特殊的信号---- SIGCHILD
- 在线编辑器
- 服务器太多怎么办?锐盾KVM 出新招
- SSM框架使用POI技术导出Excel表
- 美团2017编程题—拼凑钱币&大富翁游戏&最大矩形面积&最长公共连续子串
- 多线程环境下操作HashMap的问题
- Gson解析Json外层数组
- 自定义RecyclerView的网格分割线
- 中亦科技黄远邦技术人生(16) ——红色警报--Oracle宕机潮来临,快快行动起来!