linux wait 子进程,为什么子进程必须使用“ wait()”?

小编典典

我可能必须添加一个存储子pid的进程表,并且必须使用waitpid(不是很明显),但是要经过一段时间后才这样做-

这是一个问题,因为子进程的运行时间从几微秒到几分钟不等。 。如果我太早使用waitpid,那么我的父进程将被阻止

请查看的文档waitpid。您可以waitpid使用该WNOHANG选项告知“

不阻止”(即,如果没有要收获的孩子,请立即返回)。此外,您无需提供waitpidPID。您可以指定-1,它将等待 任何

孩子。因此waitpid,如下所示的调用符合您的无阻塞约束和无节省pids约束:

waitpid( -1, &status, WNOHANG );

如果您 确实 不想正确处理流程的创建,则可以init通过两次分叉,收割子代并将其exec交给孙子来承担收割责任:

pid_t temp_pid, child_pid;

temp_pid = fork();

if( temp_pid == 0 ){

child_pid = fork();

if( child_pid == 0 ){

// exec()

error( EXIT_FAILURE, errno, "failed to exec :(" );

} else if( child_pid < 0 ){

error( EXIT_FAILURE, errno, "failed to fork :(" );

}

exit( EXIT_SUCCESS );

} else if( temp_pid < 0 ){

error( EXIT_FAILURE, errno, "failed to fork :(" );

} else {

wait( temp_pid );

}

在上面的代码片段中,子进程派生出自己的子进程,立即存在,然后立即被父进程收割。孙子是孤立的,由收养init,并且将自动获得。

为什么Linux完全保留僵尸?为什么我要等我的孩子?这是为了对父流程执行纪律吗?在使用Linux的几十年中,我从未从僵尸进程中获得任何有用的东西,我还没有完全了解到僵尸作为“功能”的有用性。如果答案是父进程需要找到自己的孩子发生了什么的方法,那么,上帝的缘故,没有理由将僵尸视为正常进程,并因为存在太多僵尸进程而禁止创建非僵尸进程僵尸。

您还建议如何有效地检索流程的退出代码?问题在于PID

<=>退出代码(等)的映射必须是一对一的。如果内核在退出,收获或未收获时立即释放了该进程的PID,然后新进程继承了相同的PID并退出,那么如何处理为一个PID存储两个代码?感兴趣的进程将如何检索第一个进程的退出代码?不要以为

没有人 在乎退出代码是因为您不在乎。您认为是滋扰/错误的东西被广泛认为是有用和干净的。

在我目前正在开发的系统上,在一切停止之前,我只能产生400到500个进程(这是在我能找到的最便宜的VServer上运行的维护不佳的CentOS系统-

但仍然有400台僵尸程序不足几kB的信息)

关于使人们普遍接受的内核行为成为对维护不佳/廉价系统的明显挫败感的替罪羊,这似乎是不对的。

通常,最大进程数仅受内存限制。您可以通过以下方式查看限额:

cat /proc/sys/kernel/threads-max

2020-06-07

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值