2009-06-17 83 views
11

在我正在開發的基於Linux的項目中,我需要能夠找到我所有的子進程。每次開始記錄都不可行 - 他們需要在事後尋找。這需要純粹的C,並且我想在不讀取/ proc的情況下做到這一點。有誰知道如何做到這一點?如何查找所有子進程?

+0

通過「純C」我有點包括'不解析命令輸出'。 – c4757p 2009-06-17 21:29:13

+0

爲什麼不可行?這是迄今爲止最乾淨和最有效的方式。 – Duck 2009-06-17 21:31:52

+0

您是否反對編寫一個將覆蓋未使用的系統調用之一的LKM?如果是這樣,編寫一個小的系統調用將爲你做到這一點是微不足道的。 – FreeMemory 2009-06-18 14:57:12

回答

2

我發現你的評論,它不是有限的可以記錄過程的創建是奇怪的,但如果你真的不能(可能是因爲你不知道有多少人會被創建,不想保留內存),那麼我可能會打開所有與glob /proc/[1-9]*/status相匹配的文件並查找說PPid: <num>的行,其中<num>是我的進程ID。

1

您可以解析包含父進程ID的進程列表(ps -ax?)。這可能可以通過一個簡單的shell腳本完成。

+0

他說純c;)。我以成功的方式完成了這項工作。 – 2009-06-17 21:23:30

+0

如果從中執行shell命令,它仍然算作純C嗎? – sangretu 2009-06-17 21:26:24

3

你可以使用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; 
} 


4

它通常是完全可行的,記錄子進程每次啓動一次。方便地,父進程傳遞子進程的pid值作爲創建它的fork調用的返回值。

由於該男子頁說:

pid_t fork(void); 

這將有助於如果你能告訴我們你爲什麼認爲這是不可行的。

0

如果你想跟蹤叉事件,並提取孩子的PID進行調試,有許多方法可以做到這一點,包括:

  • 使用GDB
  • 使用strace的
  • 使用的SystemTap
  • 使用內核事件連接器(不知道這些是什麼)
3

你可以試試這個

#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()執行的完整命令

0

如果你想獲得的等着他們非常具體的目的,所有子進程退出,你可以使用waitpid函數(-1,...):

while (true) { 
    // Wait for any child exiting 
    int child_status; 
    const int child_pid = waitpid(-1, &child_status, 0); 
    // check child_status 
}