子进程终止父进程捕捉子进程退出信号
2012-05-17 23:01
253 查看
要想不产生僵尸进程还有另外一种办法:父进程调用sigaction将SIGCHLD的处理动作置为SIG_IGN,这样fork出来的子进程在终止时会自动清理掉,不会产生僵尸进程,也不会通知父进程。系统默认的忽略动作和用户用sigaction函数自定义的忽略通常是没有区别的,但这是一个特例。此方法对于Linux可用,但不保证在其它UNIX系统上都可用。请编写程序验证这样做不会产生僵尸进程。
这里就不使用sigaction,这种方式比较麻烦。所以使用signal函数这个函数也是封装的sigaction
这里就不使用sigaction,这种方式比较麻烦。所以使用signal函数这个函数也是封装的sigaction
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <signal.h> #include <sys/types.h> #include <sys/wait.h> pid_t p; void sig_term(int sig){ int i = 0; waitpid(p, &i, 0); //这里取得的退出状态也为2 printf("%d\n",WEXITSTATUS(i)); } int main(){ int i = 0, j = 0; p = fork(); if (p<0) { perror("fork error\n"); exit(1); } if (p>0) { //this is parent for (; i<20; i++) { sleep(1); //接收子进程退出的信号 signal(SIGCHLD, sig_term); printf("this is parent\n"); } }else{ //this is child for (; j<5; j++) { sleep(1); printf("this is child\n"); } //子进程退出状态为2 exit(2); } return 1; }
相关文章推荐
- 验证子进程退出时会给父进程发送信号的机制 、 编写父进程等待子进程的异步版本
- C语言信号-捕捉子进程退出的信号
- 2信号处理之:信号产生原因,进程处理信号行为,信号集处理函数,PCB的信号集,sigprocmask()和sigpending(),信号捕捉设定,sigaction,C标准库信号处理函数,可重入函数,
- linux中父进程退出时如何通知子进程
- linux接受到abrt信号后退出的进程信息
- 为应用程序池**提供服务的进程意外终止。进程ID是**。进程退出代码是'0x80'
- exit和_exit 进程终止有5种方法: 1正常终止 (1)从main函数返回 (2)调用exit (3)调用_exit 2异常终止 (1)调用abort (2)由一个信号来终止 exi
- Windows内核之进程的终止和子进程
- 关于子进程继承父进程信号特性
- Windows核心编程 进程--CreateProcess函数 终止进程和子进程 进程的权限
- 用进程相关API函数编程一个程序,使之产生一个进程扇,父进程产生一系列子进程,每个子进程打印自己的PID然后退出。要求父进程最后打印PID
- 主线程退出,不代表进程会终止
- 调用信号处理程序被捕捉的信号自动地加到进程的当前信号屏蔽字中signal() sigpending()
- 僵死进程、子进程退出的异步善后处理
- linux下的wait()实现等待一个子进程和所有子进程退出
- 为应用程序池**提供服务的进程意外终止。进程ID是**。进程退出代码是'0x80'
- PHP进程之信号捕捉中的declare(ticks=1)
- SIGPIPE信号导致进程退出
- 信号退出【Linux学习笔记】kill及kill -9的用法及如何实现进程的优雅退出
- 计算机的异常控制:中断、陷阱、故障、终止、进程上下文切换、信号