父进程退出后如何通知子进程退出
来源:互联网 发布:oracle创建本地数据库 编辑:程序博客网 时间:2024/04/29 12:43
本文首先发表在 YYNOTE.COM .
原文地址: http://yynote.com/blog/detail/others/how-to-make-child-process-exit-after-parent-exits
Linux 中创建子进程是相当方便的,通过fork调用即可。当子进程退出时,要给父进程发送SIG_CHLD信号,是为了父进程回收子进程的资源,方便管理的目的。 但是当父进程退出后,一般是不会通知子进程的,父进程会将自己的所有子进程过继给init进程。
但是,在实际的项目中,我们有这样的需求: 如果父进程退出后,希望能通知子进程退出。
我们知道,可以利用进程间通信机制,在父进程退出前主动发送信号或pipe或其他手段告知子进程自己退出了。
但是,当父进程意外退出时,比如coredump了,根本没机会主动发送信号或pipe等消息的。
这时怎么办呢?
我们发现 prctl 这个调用, 通过man prctl:
PR_SET_PDEATHSIG (since Linux 2.1.57)
Set the parent process death signal of the calling process to arg2 (either a signal value in the range
1..maxsig, or 0 to clear). This is the signal that the calling process
will get when its parent dies.
据此, 我们可以在子进程中给父进程设置当父进程退出时子进程收到的信号。
prctl(PR_SET_PDEATHSIG, SIGHUP);
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/prctl.h>
#include <signal.h>
static int do_abort = 0;
void handle_signal(int signo)
{
if (signo == SIGHUP)
{
printf("child recv SIGHUP..\n");
do_abort = 1;
}
}
int main(void)
{
pid_t pid;
pid = fork();
char *p = NULL;
if (pid == 0) // child
{
signal(SIGHUP, handle_signal);
prctl(PR_SET_PDEATHSIG, SIGHUP);
while(!do_abort) {
sleep(1);
printf("in child...\n");
}
printf("child exit...\n");
return 0;
}
else // parent
{
int times = 5;
while(times -- > 0)
{
sleep(1);
if (times == 3)
{
printf("memcpy ...\n");
memcpy(p, "Hello", 5);
}
printf("in parent.\n");
}
printf("parent exit..\n");
return 0;
}
return 0;
}
通过测试,如果去掉 prctl调用,当父进程发生段错误退出后,子进程依然继续运行。 如果去掉signal调用,即子进程不捕获SIG_HUP信号,当父进程退出后依然会退出,只是退出的有些不优雅罢了。
原创文章,版权归属yynote.com.转载请标明出处.
本文地址: http://yynote.com/blog/detail/others/how-to-make-child-process-exit-after-parent-exits
0 0
- 父进程退出后如何通知子进程退出
- 父进程退出后如何通知子进程退出
- linux中父进程退出时如何通知子进程
- Python父进程退出后,子进程自动退出的办法
- 父进程等待子进程退出
- 父进程异常退出时,确保子进程退出
- OTP的supervisor tree如何保证子进程一定随父进程的退出而退出
- python 如何优雅地退出子进程
- Linux 进程--父进程查询子进程的退出状态
- Linux 进程--父进程查询子进程的退出状态
- 如何完整退出进程
- 退出子进程的办法
- 父进程获取子进程退出状态(1)
- 父进程获取子进程退出状态(2)
- 父进程退出,保证子进程交由init。
- 子进程等待父进程退出及fork使用
- 子进程退出时会给父进程发信号吗?
- linux子进程知道父进程退出的解决方案
- android安装busybox
- 爱上现在超清瞎猜爱上才
- DefaultHttpClient
- POJ 1947 Rebuilding Roads
- 我新政策爱上自行车爱上
- 父进程退出后如何通知子进程退出
- HTML标签大全(常用)
- wikioi 1269 匈牙利游戏
- EasyUI使用实例
- DM365 montavista交叉编译链arm_v5t配置
- Linux--mail 命令
- 【Bootstrap3.0建站笔记二】按钮可下拉弹出层
- Server.MapPath()
- <mvc:annotation-driven />