2014-03-24 32 views
1

我在一個過程中做了很多分叉操作(並且該過程的子節點是進一步分叉的),並且我希望對創建的進程總數保持可接受的限制。如何查找C中進程的子進程數?

是否有查找過程(包括兒童的孩子,孩子的孩子的孩子等)選自C兒童的總數的(優選高效)的方法是什麼?

,我想我的代碼在Linux和Mac上工作,所以沒有/proc我怕!

+0

ü檢查[this](http://stackoverflow.com/questions/1009552/how-to-find-all-child-processes)後? – Huseyin

+0

沒有辦法繞過它:你將不得不使用非可移植的技術(例如從procfs或'popen'ing'ps')和'#ifdef'平臺讀取數據。沒有標準的枚舉過程接口。一般的假設是你可以維護你自己的孩子名單,並且你不會對你的孫子女(也就是你的過程在最後一個'execve'之前已經擁有的任何子女)感興趣。當這些假設不成立時,你會被困在做一些額外的工作。 –

回答

1

無法枚舉進程的所有子進程,除了枚舉系統的所有進程並檢查其PPID。 (當然,從父母本身開始,你可以跟蹤你的分叉。)根本沒有辦法列舉一個過程的所有後代:如果P分叉Q分叉R然後Q死亡,那麼沒有更多的信息與R.

涉及P上的可移植的方式來獲得關於過程的信息是調用ps效用和解析它的輸出。

如果要限制進程的後代數量,可以通過使用專用用戶運行該進程並啓動具有所需每個用戶進程限制的祖先(setrlimit(RLIMIT_NRPROC, …))來輕鬆完成。

您還可以使用某種共享資源;只要後代進程不關閉該資源,這將工作。例如,您可以打開一個文件(沒有O_CLOEXEC標誌),如果後代沒有調用fcntl和該文件上的FD_CLOEXEC標誌,也不需要關閉它。我認爲在OSX上,你需要分叉fuserlsof(或者也可以在Linux上工作)找出有多少進程打開文件,但我不知道如何在沒有OSX分叉的情況下這樣做。您可能會研究其他機制,如共享內存(shm_open和朋友)或內存映射(mmap和朋友),但對於這些我不知道如何使用計數而不分叉。

0

檢查this。如果您可以創建所有進程之間共享的變量,那麼您可以根據該共享計數器值監視進程的數量。
甚至this答案可以幫助您創建共享變量。

1

沒有可移植的API來做什麼,你在問什麼。 C本身甚至沒有定義進程的概念,操作系統的進程管理API非常具體,通常也不可移植。

要麼你找到一個可移植的抽象庫,或者你自己實現它。

+0

C沒有,但是假設操作系統具有分叉(即它是一些unix變體 - 現在已經編輯提及Linux和Mac的問題),概念就在那裏。 – Gilles

0

您可以在根進程中打開一個管道或套接字,並讓每個子進程在創建時以及退出時寫入。如果你想限制後代進程的總數,你可以讓孩子在分叉之前檢查根進程,而不是在之後通知它。