2014-10-19 89 views
1
Parent-> fork 
------------1st Child(A)-> fork again 
-------------------->1st Child's Child(Aa) 

如果我父,如何讓C程序的孩子的孩子(AA)的pid? 或者如何獲得這個組中的所有pid?C程序 - 如何讓孩子的孩子PID在父[後叉]

+3

你根本不可能,除非你有一些IPC方法來傳遞它了。 – 2014-10-19 04:26:28

+0

孩子可以做零個,一個或多個叉子,沒有孩子的孩子。 – 2014-10-19 04:54:03

+0

那麼,是否有可能獲得組pid內的所有pid?如果不是,那麼group pid有什麼用? (因爲在C中有一些setpgid) – 2014-10-19 04:55:48

回答

2

這裏沒有一個直接的辦法讓孩子的PID父PID(getppid()), ...

fork()返回三個值中的一個:孩子PID,0和-1。

  1. 孩子pid被返回給父母。
  2. 將0返回給父代碼中的孩子。
  3. fork()有錯誤時返回-1。

...所以你已經有孩子(rens)pid(s)fork()之前和之後。例如,如果你想要execl之後的孩子pid,最簡單的方法就是當它由fork()返回時,即掛在它上面,即;存儲它。

如果這對於您來說效率不夠,您可以設置一個pipe()或兩個將其傳回父級。

int io[2]; 
pipe(io); 

io[0] is in; io[1]不存在。您可以使用write()read()

+0

在linux中,當我輸入「ps aux」時,它會顯示所有的pid。這個概念可以在C中使用以獲得想要的pid嗎?還有一個問題:是否可以在組pid內獲得所有pid?如果不是,那麼group pid有什麼用? (因爲在C中有一些setpgid) – 2014-10-19 05:00:54

+1

你總是可以從你的C代碼中調用它作爲'system(「ps aux」);'但是你仍然需要鑽研我的想法。我不知道一種方法來獲得一個組中的所有pid。 ps上的選項可以做到這一點,但看起來像很多工作,至少比存儲它們更多。 – ChiefTwoPencils 2014-10-19 05:31:40

+0

任何這樣的方法都有嚴重的錯誤識別過程和競爭條件。 – 2014-10-19 05:38:41

1

這裏是使用管道與兒子對應一個小例子:

#include <stdio.h>     
#include <signal.h> 
#include <unistd.h> 

int main(int argc, char *argv[]) 
{ 
    pid_t ppid,pid,spid;  
    int io[2]; 
    pipe(io); 
    if((pid=fork())>0){//father 
     close(io[1]); 
     read(io[0],&spid,sizeof(pid_t)); 
     ppid = getpid(); 
     printf("father:%ld\tme:%ld\tson:%ld\n",ppid,pid,spid); 
    }if(pid==0){//me 
     close(io[0]); 
     pid = getpid(); 
     ppid 
      = getppid(); 
     if((spid=fork())>0){//me 

     }else if(spid==0){//son 
      spid = getpid(); 
      write(io[1],&spid,sizeof(spid)); 
     } 
    } 

    return 0; 
}