gpt4 book ai didi

c - waitpid 子进程不成功

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

我正在使用 execv 启动一个进程并让它写入一个文件。我同时启动了一个线程来监视文件,以便它的大小不超过使用 stat.st_size 的特定限制。现在,当达到限制时,我为子进程 waitpid ,但这会引发错误并且我在后台启动的进程变成僵尸进程。当我从主线程使用相同的 waitpid 停止时,进程被杀死而没有变成僵尸。有什么想法吗?

编辑:errno 为 10,waitpid 返回 -1。这是在 linux 平台上。

最佳答案

没有代码很难调试,但是errno 10 是ECHILD

根据手册页,返回如下:

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.)

简而言之,您指定的 pid 不是调用 waitpid() 的进程的子进程(或者不再是,可能是因为它已终止)。

注意括号部分:

  • “如果将 SIGCHLD 的操作设置为 SIG_IGN,这可能会发生在自己的 child 身上” - 如果您为 SIGCHLD 设置一个信号处理程序为 SIG_IGNwait 有效地自动完成,因此 waitpid 获胜' 工作,因为 child 已经终止(不会经历僵尸状态)。

  • “另请参阅有关线程的 Linux 注释部分。” - 在 Linux 中,线程本质上是进程。现代 linux 将允许一个线程等待其他线程的子线程(前提是它们在同一个线程组中——广义上是父进程)。如果您使用的是 2.4 之前的 Linux,则情况并非如此。有关详细信息,请参阅有关 __WNOTHREAD 的文档。

我猜线程是一个转移注意力的问题,问题实际上是信号处理程序,因为这符合您的说法“进程在没有变成僵尸的情况下被杀死。”

关于c - waitpid 子进程不成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30032775/

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