gpt4 book ai didi

c - waitpid/wait/waitid选哪个?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:58:41 26 4
gpt4 key购买 nike

我想在执行 fork 后在子进程中使用 execl。 execl 将执行脚本,大约需要 120 秒的时间。我尝试了几乎所有与 waitpid、wait 和 waitid 的组合以及不同的参数(0、WNOHANG 等),但在所有情况下我都得到 -1 返回值。所以我想知道我需要在什么时候使用哪个等待函数?所以我可以专注于一个等待函数来让它工作。

我从日志中观察到的一件更有趣的事情是,当我在子进程中什么都不做时,它会显示我的父线程是孤立的。我不知道这怎么可能?我的父线程如何成为孤立线程?

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>

int main(void)
{
pid_t Checksum_pid = fork();

if (Checksum_pid < 0)
printf("Fork Failed\n");
else if (Checksum_pid == 0)
{
execl("/bin/ls","ls",(char *)NULL) ;
exit(EXIT_FAILURE);
}
else
{
int childStatus;
pid_t returnValue = waitpid(Checksum_pid, &childStatus, 0);

if (returnValue > 0)
{
if (WIFEXITED(childStatus))
printf("Exit Code: %d\n", WEXITSTATUS(childStatus));

}
else if (returnValue == 0)
printf("Child process still running\n");
else
{
if (errno == ECHILD)
printf(" Error ECHILD!!\n");
else if (errno == EINTR)
printf(" Error EINTR!!\n");
else
printf("Error EINVAL!!\n");
}
}

return 0;
}

最佳答案

正如我所说:你的最后一个 else 应该是

 else perror("waitpid");

但是您得到的是 ECHILD。所以请阅读 waitpid(2)手册页:

   ECHILD (for wait()) The calling process does not have any unwaited-
for children.

ECHILD (for waitpid() or waitid()) The process specified by pid
(waitpid()) or idtype and id (waitid()) does not exist or is
not a child of the calling process. (This can happen for
one's own child if the action for SIGCHLD is set to SIG_IGN.
See also the Linux Notes section about threads.)

顺便说一句,我无法重现您的错误。还要检查 ulimit -a 在 bash 上给出的限制。

也许您的 execl 失败了(尤其是当您执行某些脚本而不是 /bin/ls 时)。在它之后添加对 perror 的调用。

此外,使用 gcc -Wall -g 编译并使用 stracegdb

关于c - waitpid/wait/waitid选哪个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22933500/

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