【问题标题】:"execv" child process existance and termination“execv”子进程存在和终止
【发布时间】:2011-12-11 22:35:31
【问题描述】:

popen() alternative - 我正在使用accepted 答案(pipe/fork/exec 方法)来解决我的问题。唯一不同的是,我使用的是execv,而不是execl

现在,我的问题是,父进程是否可以控制execv 创建的子进程?假设accepted 答案中建议的整个序列用于拖尾 1 个文件,我有很多这样的文件;我把这整个序列放在一个函数中,如果我在某个时间点多次调用这个函数,是否有可能有很多子 tail 进程在附近?

我想知道的是, 1)我可以在任何时间点运行多个子进程吗? 2)子进程(由execv创建)如何终止?在execv 调用之后,父进程是否知道子进程(由 execv 创建)何时完成/终止? - 回答。

【问题讨论】:

  • 如果你能够使用它,GLib 对这些东西有一个防弹的实现:developer.gnome.org/glib/2.30/glib-Spawning-Processes.html 很难搞定(我知道,因为我写了一个 GLib,当然它可能还不是很好,但它处理了大量的细节)
  • 短语“execv 创建的子进程”不正确。 execv 不会创建孩子。

标签: c unix process exec


【解决方案1】:

Execl 和 execv 的行为方式相同。 The only difference is how you specify the argument vector。 “l”函数将参数向量作为逗号分隔的列表。例如,

execl("/bin/ls", "/bin/ls", "-r", "-t", "-l", NULL);

“v”函数将参数向量作为实际向量。例如,

char *args[] = {"/bin/ls", "-r", "-t", "-l", NULL };
execv("/bin/ls", args);

有关 C 中的过程控制的信息,请参阅 herehere

一般来说,子进程在执行完毕后终止。父进程或其他进程可以随时杀死子进程。父进程可以使用 waitpid() 函数等待子进程完成执行或检查子进程是否执行完毕。

【讨论】:

    【解决方案2】:

    父级收到SIGCHLD 信号。

    【讨论】:

    • 谢谢奥利。在整个序列中,我是否可以这样做,即使我需要为 10 个(例如)文件执行 tail (或任何其他命令),我也一个接一个地执行。我不想在任何时间点有超过 1 个子进程处于活动状态。这可能吗?
    • 感谢奥利。我还有另一个可能有点不同的问题:当我对孩子执行kill 时,它会立即释放所有资源吗?操作系统的进程表是否立即知道它的死亡?
    • 如果你杀死一个进程,是的,它的所有资源都将被操作系统释放,除了进程表中包含子进程返回值的条目。孩子被认为是僵尸。你的父进程应该使用wait()“收获”子进程,它会收集它的返回值并释放进程表条目。如果你的父进程在它收获它的子进程之前就死了,init 会为它做收获。在此处查看接受的答案:stackoverflow.com/questions/2353079/…
    【解决方案3】:

    如果您有来自孩子标准输出的管道,您通常可以通过观察管道获取 EOF 来避免信号/等待恶化。尽管http://en.wikipedia.org/wiki/Zombie_process,您仍然必须收割孩子以避免僵尸(如果您不关心孩子的退出状态,这通常是通过双叉完成的,因此您将真正的子进程作为孙子运行并收割中间孩子) . GLib 代码可能是最复杂的示例:http://git.gnome.org/browse/glib/tree/glib/gspawn.c#n1191

    【讨论】:

    • 如果孩子明智地关闭了所有 fds,那你就不走运了。
    • 通常重点是捕获孩子的标准输出,因此可以安全地假设它不会关闭标准输出,或者如果它关闭,无论如何你已经完成了它。如果您的目标不是啜孩子的输出,那么您当然不在“经常”的情况下。
    • @Havoc P:感谢您的回复。我在FreeBSD。我的问题是,我正在使用这种管道/叉子/执行方法,并且我在某个时间点看到很多僵尸 - 这填满了我的进程表(这是一个低端盒子),这就是我杀死我的原因主父进程并退出程序。现在,有些事情是在我的主程序(父进程)中创建了很多子进程。但我不确定这怎么可能。但是当 fork() 失败时(因为 max proc),那时我看到很多 以父进程作为主要进程。我怎样才能追溯到谁是罪魁祸首?
    • @jørgensen 你能详细说明一下吗?
    • 僵尸是因为有人没有等待他们的孩子......你基本上必须盯着代码并找到丢失的清理。或者使用中间子方法来避免以后需要收割。
    猜你喜欢
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    相关资源
    最近更新 更多