&引用;execv";子进程存在和终止

&引用;execv";子进程存在和终止,c,unix,process,exec,C,Unix,Process,Exec,-我正在使用accepted答案(pipe/fork/exec方法)来解决我的问题。唯一的区别是,我使用的不是execl,而是execv 现在,我的问题是,父进程是否可以控制由execv创建的子进程?假设accepted答案中建议的整个序列用于跟踪1个文件,我有很多这样的文件;我把整个序列放在一个函数中,如果我在某个时间点多次调用这个函数,是否可能有很多子tail进程 我想知道的是, 1) 我可以在任何时间点运行多个子进程吗? 2) 子进程(由execv创建)如何终止?在execv调用之后,父进

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

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

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

父级接收信号。

父级接收信号。

Execl和execv的行为方式相同。“l”函数将参数向量作为逗号分隔的列表。例如:

execl("/bin/ls", "/bin/ls", "-r", "-t", "-l", NULL);
“v”函数将参数向量作为实际向量。例如:

char *args[] = {"/bin/ls", "-r", "-t", "-l", NULL };
execv("/bin/ls", args);
有关C中过程控制的信息,请参阅或


通常,子进程在完成执行时终止。父进程或其他进程可以随时终止子进程。父级可以使用waitpid()函数等待子级完成执行,或者检查子级是否完成执行。

Execl和execv的行为方式相同。“l”函数将参数向量作为逗号分隔的列表。例如:

execl("/bin/ls", "/bin/ls", "-r", "-t", "-l", NULL);
“v”函数将参数向量作为实际向量。例如:

char *args[] = {"/bin/ls", "-r", "-t", "-l", NULL };
execv("/bin/ls", args);
有关C中过程控制的信息,请参阅或


通常,子进程在完成执行时终止。父进程或其他进程可以随时终止子进程。父级可以使用waitpid()函数等待子级完成执行,或者检查子级是否完成执行。

如果子级的stdout中有一个管道,通常可以通过观察管道获得EOF来避免信号/等待恶化。尽管如此,您仍然必须收获子进程以避免僵尸(如果您不关心子进程的退出状态,这通常是通过双叉完成的,因此您可以作为孙子运行真正的子进程并收获中间子进程)。GLib代码可能是最复杂的例子:

如果您有来自孩子标准输出的管道,您通常可以通过观察管道是否出现EOF来避免信号/等待恶化。尽管如此,您仍然必须收获子进程以避免僵尸(如果您不关心子进程的退出状态,这通常是通过双叉完成的,因此您可以作为孙子运行真正的子进程并收获中间子进程)。GLib代码可能是最复杂的例子:

谢谢。在整个序列中,我可以这样做,即使我需要对10个(例如)文件执行tail(或任何其他命令),我也会一个接一个地执行。我不希望在任何时间点有超过1个子进程处于活动状态。有可能吗?谢谢你,奥利。我还有另一个可能有点不同的问题:当我对孩子做
kill
时,它会立即释放所有资源吗?OS的进程表是否立即知道它的死亡?如果您杀死一个进程,是的,它的所有资源都将被operatin系统释放,进程表中包含子进程返回值的条目除外。孩子被认为是一个僵尸。您的父进程应该使用wait()来“收获”子进程,它将收集其返回值并释放进程表条目。如果父进程在收获其子进程之前死亡,init将为其进行收获。请看这里被接受的答案:谢谢,奥利。在整个序列中,我可以这样做,即使我需要对10个(例如)文件执行tail(或任何其他命令),我也会一个接一个地执行。我不希望在任何时间点有超过1个子进程处于活动状态。有可能吗?谢谢你,奥利。我还有另一个可能有点不同的问题:当我对孩子做
kill
时,它会立即释放所有资源吗?OS的进程表是否立即知道它的死亡?如果您杀死一个进程,是的,它的所有资源都将被operatin系统释放,进程表中包含子进程返回值的条目除外。孩子被认为是一个僵尸。您的父进程应该使用wait()来“收获”子进程,它将收集其返回值并释放进程表条目。如果父进程在收获其子进程之前死亡,init将为其进行收获。请看这里被接受的答案:如果你能使用它,GLib有一个防爆炸的实现:很难把它做好(我知道,因为我写了GLib一个,当然它可能还不好,但它处理了大量的细节)短语“由execv创建的子进程”是不正确的。execv不创建子进程。如果你能使用它,GLib有一个防爆炸的实现:很难把它做好(我知道,因为我写了GLib一个,当然它可能还不好,但它处理了大量的细节)短语“由execv创建的子进程”是不正确的。execv不会创建子项。如果子项明智地关闭了所有FD,那么您就没有运气了。通常,关键是要捕获子项的stdout,因此可以安全地假设它不会关闭stdout,或者如果关闭了,您无论如何都已经完成了。如果您的目标不是让孩子发出咕噜咕噜的声音,那么您当然不属于“经常”的情况。@Havoc P:谢谢您的回复。我在
FreeBSD
上。我的问题是,我正在使用这个pipe/fork/exec方法,我在某个时间点看到了很多僵尸——这填满了我的进程