Fra*_*lea 13 c fork exec defunct
我想使用fork> exec过程创建许多子进程.许多过程都以非常快的速度结束(不到两分钟,有些甚至更早).
我的第一个问题是,我将生成的进程放入后台
./spawnbot > logging.txt
[CTRL+Z]
bg 1
disown
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.现在我不再看到任何spawnbot的消息,他们直接进入logging.txt.然而,每当创建一个新的孩子时,我再次在我的控制台中看到关于那个孩子的所有信息..我现在想要用它自己的管道启动每个孩子 - 是否有更好的方法让孩子们在他们的输出消息全部发布安慰?我应该将它重定向到/ dev/null还是用C中的一些标志完成?
其次,所有的孩子都没有真正被杀.我的ps -ef中有很多进程.我该怎么办?我该怎么做
小智 19
首先你的第二个问题!
您的孩子处于"僵尸"模式,因为内核认为您可能仍希望从中检索返回值.
如果您无意从子进程获取返回值,则应将父进程中的SIGCHLD信号处理程序设置为SIG_IGN,以使内核自动获取子进程.
signal(SIGCHLD, SIG_IGN);
Run Code Online (Sandbox Code Playgroud)
第一个问题取决于你的实施..
但一般来说,就在fork()之后,你应该使用close()关闭0和1的旧文件描述符,然后用dup2()它们将它们设置为你想要的值.现在没时间做一个例子,但希望这会推动你进入正确的方向..
Gil*_*il' 14
你的孩子进程被杀了.已失效的流程也称为僵尸流程 ; 僵尸死了!僵尸进程只是进程表中的一个条目,它没有任何代码或内存.
当进程死亡(通过调用_exit或被信号杀死)时,它必须由其父进程获取.除了进程表中的条目之外,进程使用的每个资源都会消失.家长必须打电话wait或waitpid.一旦父母被告知儿童过程的死亡,并且有机会阅读孩子的退出状态,孩子在过程表中的条目也会消失:僵尸被收获.
如果您从未希望收到有关您孩子死亡的通知,请忽略该SIGCHLD信号; 这告诉内核你不想知道你孩子的命运,僵尸会被自动收获.
signal(SIGCHLD, SIG_IGN)
Run Code Online (Sandbox Code Playgroud)
如果你只是想通知你孩子的具体情况死亡的,调用sigaction与SA_NOCLDWAIT标志.当一个孩子去世时,如果父母正在执行其中一个wait职能部门,则会通知孩子的死亡并被告知退出状态; 否则孩子的退出状态将被丢弃.
struct sigaction sa;
sa.sa_handler = &my_sigchld_handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_NOCLDWAIT;
sigaction(SIGCHLD, &sa, NULL);
Run Code Online (Sandbox Code Playgroud)
关于输出,您的孩子写入与父母相同的地方,除非您明确地重定向它们(使用close和open,或dup,或许多其他可能性).您的孩子可能正在将诊断消息打印到标准错误(毕竟这就是它的用途).
./spawnbot >logging.txt 2>&1
Run Code Online (Sandbox Code Playgroud)
此外,由于您似乎想要从终端分离孩子,您可能希望确保他们在终止终端时不会收到SIGHUP.所以使用nohup:
nohup ./spawnbot >logging.txt 2>&1 &
disown
Run Code Online (Sandbox Code Playgroud)