在我正在開發的基於Linux的項目中,我需要能夠找到我所有的子進程。每次開始記錄都不可行 - 他們需要在事後尋找。這需要純粹的C,並且我想在不讀取/ proc的情況下做到這一點。有誰知道如何做到這一點?如何查找所有子進程?
回答
我發現你的評論,它不是有限的可以記錄過程的創建是奇怪的,但如果你真的不能(可能是因爲你不知道有多少人會被創建,不想保留內存),那麼我可能會打開所有與glob /proc/[1-9]*/status
相匹配的文件並查找說PPid: <num>
的行,其中<num>
是我的進程ID。
您可以解析包含父進程ID的進程列表(ps -ax?)。這可能可以通過一個簡單的shell腳本完成。
他說純c;)。我以成功的方式完成了這項工作。 – 2009-06-17 21:23:30
如果從中執行shell命令,它仍然算作純C嗎? – sangretu 2009-06-17 21:26:24
你可以使用POPEN
喜歡的東西。 (希望語法是足夠接近)
#include <stdio.h> #include <unistd.h> #include <stdlib.h> int main(int argc, char *argv[]) { FILE *fp = popen("ps -C *YOUR PROGRAM NAME HERE* --format '%P %p'" , "r"); if (fp == NULL) { printf("ERROR!\n"); } char parentID[256]; char processID[256]; while (fscanf(fp, "%s %s", parentID, processID) != EOF) { printf("PID: %s Parent: %s\n", processID, parentID); // Check the parentID to see if it that of your process } pclose(fp); return 1; }
它通常是完全可行的,記錄子進程每次啓動一次。方便地,父進程傳遞子進程的pid值作爲創建它的fork調用的返回值。
由於該男子頁說:
pid_t fork(void);
這將有助於如果你能告訴我們你爲什麼認爲這是不可行的。
如果你想跟蹤叉事件,並提取孩子的PID進行調試,有許多方法可以做到這一點,包括:
- 使用GDB
- 使用strace的
- 使用的SystemTap
- 使用內核事件連接器(不知道這些是什麼)
你可以試試這個
#include<string.h>
#include <sys/types.h>
#include <unistd.h>
char str[50] = "ps -o pid --ppid ";
char ppid [7];
sprintf(ppid,"%d",getpid());
strcat(str,ppid);
system(str);
注:這段代碼需要在父進程
基本上ps -o pid --ppid <parent_id>
給所有的子進程的父具有PID的PID。現在,我們可以通過使用getpid()來獲取父進程的PID,該getpid()返回pid_t
並隱式轉換爲整數..sprintf將其轉換爲字符串,然後將結果與str
連接以獲取由system()
執行的完整命令
如果你想獲得的等着他們非常具體的目的,所有子進程退出,你可以使用waitpid函數(-1,...):
while (true) {
// Wait for any child exiting
int child_status;
const int child_pid = waitpid(-1, &child_status, 0);
// check child_status
}
- 1. 如何檢查Linux進程及其所有子進程何時退出?
- 2. 如何等待進程及其所有子進程退出?
- 3. 進程樹,如何查找一個所述進程是否是根進程?
- 4. 查找我自己.NET進程的所有子進程/查明給定進程是否屬於我自己的子進程?
- 5. 查找子進程的數量
- 6. 查找所有子控件WPF
- 7. 查找假數的所有因子
- 8. MongoDB中查找所有子節點
- 9. 查找列表的所有子集
- 10. 查找集合的所有子集
- 11. Trie - 查找所有可能的句子
- 12. 查找neo4j中的所有子圖
- 13. 如何查找div(及其所有子元素)中的所有鏈接
- 14. 父進程沒有趕上他所有的子進程
- 15. 如何在Jquery中查找其父項的所有子項?
- 16. 如何知道並查找Magento中的所有電子郵件?
- 17. 如何在Python中查找所有子模塊?
- 18. 如何查找XPath中的所有空子樹
- 19. 如何查找所有子字符串實例?
- 20. 如何高效地查找IType的所有子類型
- 21. 如何查找整數列表的所有子集?
- 22. 如何查找所有出現的子字符串?
- 23. 如何從給定子鍵查找數組的所有父鍵?
- 24. 如何在su後找到進程的真正所有者
- 25. 如何獲取Windows中當前進程的所有子進程的句柄?
- 26. 如何跟蹤由進程及其子進程打開的所有文件?
- 27. 如何在WinCe中查找進程ID?
- 28. 如何查找所有圖形卡? C#
- 29. 如何通過PHP查找所有URL?
- 30. 如何查找所有依賴dll
通過「純C」我有點包括'不解析命令輸出'。 – c4757p 2009-06-17 21:29:13
爲什麼不可行?這是迄今爲止最乾淨和最有效的方式。 – Duck 2009-06-17 21:31:52
您是否反對編寫一個將覆蓋未使用的系統調用之一的LKM?如果是這樣,編寫一個小的系統調用將爲你做到這一點是微不足道的。 – FreeMemory 2009-06-18 14:57:12