2011-12-11 221 views
1

popen() alternative - 我正在使用accepted答案(管道/ fork/exec方法)来解决我的问题。唯一的区别是,我正在使用execv而不是execl“execv”子进程存在和终止

现在,我的问题是,父进程是否有任何控制由execv创建的子进程?可以说,在accepted答案中提出的整个顺序是用于拖尾1个文件,而且我有很多这样的文件;我把这个整个序列放在一个函数中,如果我多次调用这个函数,在某个时间点,是否有可能有许多子进程?

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

+0

如果你能够使用它,GLib有一个这种东西的防弹实现:http://developer.gnome.org/glib/2.30/glib-Spawning- Processes.html这很难让它完全正确(我知道是因为我编写了GLib,当然它可能还不是完全正确,但它处理了大量细节) –

+0

短语“由execv创建的子进程”是不正确的。 execv不创建一个孩子。 –

回答

1

如果你有一个来自孩子stdout的管道,你通常可以避免信号/等待恶化,只要看管道获取EOF即可。如果你不关心孩子的退出状态,这通常是用一个双叉子来完成的,所以你可以像孙子一样运行真正的子进程,并获得中间的孩子)。 GLib代码可能是最复杂的例子:http://git.gnome.org/browse/glib/tree/glib/gspawn.c#n1191

+0

如果孩子明智地关闭所有fds,你是失去了运气。 –

+0

通常,关键在于捕获孩子的stdout,因此可以安全地假设它不会关闭标准输出,或者如果它确实如此,那么您无论如何都会完成它。如果你的目标不是溺爱孩子的产出,那么你当然不是“经常”的情况。 –

+0

@浩劫P:感谢您的回应。我在'FreeBSD'上。我的问题是,我正在使用这个pipe/fork/exec方法,并且在某个时间点看到很多僵尸 - 这会填满我的进程表(这是一个低端框),这就是为什么我正在杀死我的主要父母程序和退出程序。现在,有些东西在我的主程序(父进程)内创建了很多子进程。但我不确定这是可能的。但是当fork()失败时(由于max proc),当时我看到很多,父进程是主进程。我怎么能追溯到谁是罪魁祸首? – hari

2

父母收到SIGCHLD信号。

+0

谢谢奥利。在整个序列中,我可以这样做,即使我需要为10个(例如)文件做尾巴(或任何其他命令),我也会一个接一个地做。我不想在任何时间点有超过1个子进程。那可能吗? – hari

+0

@hari:您可以使用['wait()'](http://linux.die.net/man/2/wait)。 –

+0

感谢奥利。我还有另一个可能有点不同的问题:当我对孩子“杀”时,它是否立即释放所有资源? OS的进程表立即知道它的死亡? – hari

3

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

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

“v”funtcions采用参数向量作为实际向量。例如,

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

herehere有关C.

在通用过程控制信息,当它执行完一个子进程终止。父母或其他进程可以随时杀死孩子。父母可以使用waitpid()函数等到孩子完成执行或检查孩子是否完成执行。