您好、欢迎来到现金彩票网!
当前位置:21点 > 子进程 >

C++干货问题父进程退出时如何确保子进程退出?

发布时间:2019-06-19 22:52 来源:未知 编辑:admin

  子进程退出的时候,父进程能够收到子进程退出的信号,便于管理,但是有时候又需要在父进程退出的时候,子进程也退出,该怎么办呢?

  一般情况下,父进程退出后,是不会通知子进程的,这个时候子进程会成为孤儿进程,最终被init进程收养。我们先来看一下这种情况。

  //sleep一段时间,让父进程先退出,为了便于观察,sleep 10s

  从结果中可以看到,一开始子进程17433的父进程id是17432,但是在10秒后,它的父进程变成了1658。1685是什么进程呢?

  由于我使用的环境是带有图形界面的ubuntu系统,所以最终并不是被我们所熟知的init进程收养,而是被一个名为/sbin/upstart的进程所收养。另外还可以观察到,该进程也是其他系统进程的父进程。

  既然如此,如何确保父进程退出的同时,子进程也退出呢?或许我们可以在子进程和父进程之间建立通信管道,一旦通信异常,则认为父进程退出,子进程自己也回收资源退出。但是这样做总觉得不是很正经。有没有已有的函数帮我们做这件事呢?prctl函数可以帮助我们。第一个参数中,有一个选项,叫做PR_GET_PDEATHSIG:

  内容很多,主要意思为:设置一个信号,当父进程退出的时候,子进程将会收到该信号。

  那么根据这个,我们完全可以在父进程退出时,也给子进程一个退出的信号。程序代码如下:

  //sleep一段时间,让父进程先退出,为了便于观察,sleep 10s

  在父进程退出时,子进程将会收到SIGKILL信号,而进程收到该信号的默认动作则是退出。因而最后不会看到它成为孤儿进程,被其他进程所收养。需要注意的是,该函数并非所有系统都支持。

  有些情况下,我们常常需要父子进程共存亡,子进程退出时,父进程可以通过wait捕捉子进程的退出状态,但是父进程退出时,子进程却难以得知。因此,在最初fork子进程的时候,便表明了,当父进程退出的时候,子进程收到SIGKILL信号,最终也退出。以此达到同生共死的目的。

  尝试将上面的代码在非图形界面的linux操作系统中运行,看看最终被收养的是否为init进程。

  虽然本文方法可行,但并不适用于所有操作系统,你有什么更好的办法解决上面的问题?返回搜狐,查看更多

http://korinkorin.com/zijincheng/84.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有