2014-10-19 64 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; 
}