gpt4 book ai didi

unix - 从父进程中分 ionic 进程

转载 作者:行者123 更新时间:2023-12-03 16:18:53 25 4
gpt4 key购买 nike

当从父进程 fork 的子进程死亡时,它在某种程度上仍然存在并处于僵尸状态,直到它从 wait() 调用中获得。

是否有可能分离这种亲子关系并让 child 自动收割?也许孤儿离开 child 来初始化,或者什么?

可能的用例:在一个长期存在的程序中创建大量即发即忘的进程,而不会“保留”越来越多的无法被操作系统回收的僵尸 PID 列表。

最佳答案

the POSIX _exit() documentation :

If the parent process of the calling process has set its SA_NOCLDWAIT flag or has set the action for the SIGCHLD signal to SIG_IGN:

  • The process' status information (see Status Information), if any, shall be discarded.

  • The lifetime of the calling process shall end immediately. If SA_NOCLDWAIT is set, it is implementation-defined whether a SIGCHLD signal is sent to the parent process.

  • If a thread in the parent process of the calling process is blocked in wait(), waitpid(), or waitid(), and the parent process has no remaining child processes in the set of waited-for children, the wait(), waitid(), or waitpid() function shall fail and set errno to [ECHILD].

Otherwise:

  • Status information (see Status Information) shall be generated.

  • The calling process shall be transformed into a zombie process. Its status information shall be made available to the parent process until the process' lifetime ends.

  • ...



总之,要防止子进程变成僵尸进程,最简单的方法就是调用 sigignore( SIGCHLD );
更新

这确实会影响等待任何子进程的能力,这可能是不希望的。 setsid() library function允许一个进程与它的父进程分离:
pid_t child = fork();
if ( ( pid_t ) 0 == child )
{
int rc = setsid();

rc = execv(...);
}
else ...

分离的子进程不会创建僵尸进程,也不会发送 SIGCHLD到我安装的 Solaris 11.2 实例上的父进程。

这是“即发即弃”子进程的简化守护进程,仅执行防止创建僵尸进程或发送 SIGCHLD 所需的操作。到父进程。有关更完整的守护进程,请参阅 Linux daemonize

关于unix - 从父进程中分 ionic 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46621463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com