如何在C中查找进程的子进程数?

时间:2014-03-24 15:11:10

标签: c process fork

我在一个过程中做了很多分配(并且该过程的子进程正在进一步分叉),并且我希望对我创建的进程总数保持可接受的限制。

是否有一种(最好是有效的)方法可以从C中找到一个过程的子女总数(包括儿童的子女,儿童的子女等)?

我希望我的代码可以在linux和mac上运行,所以没有/proc我害怕!

4 个答案:

答案 0 :(得分:1)

没有便携式API可以做,你要求的是什么。 C本身甚至没有定义过程的概念,操作系统的过程管理API非常具体,通常不可移植。

您可以找到一个可移植的抽象库来实现您想要做的事情,或者您自己实现它。

答案 1 :(得分:1)

除了枚举系统的所有进程并检查其PPID之外,无法枚举进程的所有子进程。 (当然,从父本身来看,你可以跟踪你的分叉。)根本没有办法枚举一个过程的所有后代:如果P分叉Q分叉然后Q死了,就没有更多的信息了将P与R联系起来。

获取进程信息的可移植方法是调用ps实用程序并解析其输出。

如果要限制进程后代的数量,可以使用专用用户运行该进程,并使用所需的每个用户进程限制(setrlimit(RLIMIT_NRPROC, …))启动祖先,从而轻松完成此操作。

您还可以使用某种共享资源;只要后代进程不关闭该资源,这将起作用。例如,您可以打开一个文件(没有O_CLOEXEC标记),如果后代不要在该文件上使用fcntl标记调用FD_CLOEXEC,也不要只是关闭它。我认为在OSX上你需要分叉fuserlsof(也可以在Linux上工作)来找出有多少进程打开文件,我不知道没有在OSX上分叉的方法。您可能会调查其他机制,如共享内存(shm_open和朋友)或内存映射(mmap和朋友),但对于这些机制,我不知道如何获得使用计数分叉。

答案 2 :(得分:0)

检查this。如果您可以创建在所有进程之间共享的变量,那么您可以根据该共享计数器值监视进程数 偶数this回答可以帮助您创建共享变量。

答案 3 :(得分:0)

您可以在根进程中打开一个管道或套接字,让每个子进程在创建时和退出时都写入。如果要限制后代进程的总数,可以让子进程在fork之前检查根进程,而不是在之后通知它。