- 主题:请教一个进程fork的问题
如果父进程需要时不时fork一些子进程执行某些操作,但不想等待子进程完成,而是父进程自己继续执行自己的任务
但是不wait,这些子进程结束后就编成僵尸进程,有什么好的解决方法吗
网络上说可以连续fork2次,来规避
我看了下,该方法有缺陷,需要孙子进程sleep一段时间,保证父进程先执行
有没有不需要sleep的方法?
-----------------
补:又看见一个方法,是否可行
要想不产生僵尸进程还有另外一种办法:父进程调用signal或sigaction函数将SIGCHLD信号的处理动作设置为SIG_IGN,这样fork出来的子进程在终止时会自动清理掉,不会产生僵尸进程,也不会通知父进程.系统默认的忽略动作和用户用signal或sigaction函数自定义的忽略通常是没有区别的,但这是一个特列.此方法对于Linux可用,但不保证在其他UNIX系统上都可用
例子:调用signal函数将SIGCHLD信号的处理动作自定义为忽略
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
int main()
{
signal(SIGCHLD, SIG_IGN);//将SIGCHLD信号的处理动作自定义为忽略
if (fork() == 0)
{
//child
printf("child is running, child pid: %d\n", getpid());
sleep(3);
exit(1);
}
//father
while (1);
return 0;
--
修改:b0207191 FROM 59.61.185.*
FROM 59.61.185.*
【 在 b0207191 的大作中提到: 】
: 网络上说可以连续fork2次,来规避
: 我看了下,该方法有缺陷,需要孙子进程sleep一段时间,保证父进程先执行
方法没缺陷
是你的需求有缺陷
--
FROM 139.227.19.*
如果父进程不退出的话,你就在父进程里设置一个SIGCHLD信号的处理函数,wait一下子
进程的退出就行了
如果父进程可能退出,就在子进程里用daemon函数就行了。
unp里有详细的解释
【 在 b0207191 的大作中提到: 】
: 如果父进程需要时不时fork一些子进程执行某些操作,但不想等待子进程完成,而是父
: 进程自己继续执行自己的任务
: 但是不wait,这些子进程结束后就编成僵尸进程,有什么好的解决方法吗
: 网络上说可以连续fork2次,来规避
: ...................
--
FROM 119.139.196.*
子进程是巨婴吗?执行结束后为什么不能有担当的自己结束自己?
【 在 b0207191 的大作中提到: 】
: 如果父进程需要时不时fork一些子进程执行某些操作,但不想等待子进程完成,而是父进程自己继续执行自己的任务
: 但是不wait,这些子进程结束后就编成僵尸进程,有什么好的解决方法吗
:
: ...................
--
FROM 223.101.194.*
好问题。。。哈哈
【 在 e729 的大作中提到: 】
: 子进程是巨婴吗?执行结束后为什么不能有担当的自己结束自己?
--
FROM 210.254.36.*