我在一个过程中做了很多分配(并且该过程的子进程正在进一步分叉),并且我希望对我创建的进程总数保持可接受的限制。
是否有一种(最好是有效的)方法可以从C中找到一个过程的子女总数(包括儿童的子女,儿童的子女等)?
我希望我的代码可以在linux和mac上运行,所以没有/proc
我害怕!
答案 0 :(得分:1)
没有便携式API可以做,你要求的是什么。 C本身甚至没有定义过程的概念,操作系统的过程管理API非常具体,通常不可移植。
您可以找到一个可移植的抽象库来实现您想要做的事情,或者您自己实现它。
答案 1 :(得分:1)
除了枚举系统的所有进程并检查其PPID之外,无法枚举进程的所有子进程。 (当然,从父本身来看,你可以跟踪你的分叉。)根本没有办法枚举一个过程的所有后代:如果P分叉Q分叉然后Q死了,就没有更多的信息了将P与R联系起来。
获取进程信息的可移植方法是调用ps
实用程序并解析其输出。
如果要限制进程后代的数量,可以使用专用用户运行该进程,并使用所需的每个用户进程限制(setrlimit(RLIMIT_NRPROC, …)
)启动祖先,从而轻松完成此操作。
您还可以使用某种共享资源;只要后代进程不关闭该资源,这将起作用。例如,您可以打开一个文件(没有O_CLOEXEC
标记),如果后代不要在该文件上使用fcntl
标记调用FD_CLOEXEC
,也不要只是关闭它。我认为在OSX上你需要分叉fuser
或lsof
(也可以在Linux上工作)来找出有多少进程打开文件,我不知道没有在OSX上分叉的方法。您可能会调查其他机制,如共享内存(shm_open
和朋友)或内存映射(mmap
和朋友),但对于这些机制,我不知道如何获得使用计数分叉。
答案 2 :(得分:0)
答案 3 :(得分:0)
您可以在根进程中打开一个管道或套接字,让每个子进程在创建时和退出时都写入。如果要限制后代进程的总数,可以让子进程在fork之前检查根进程,而不是在之后通知它。