Parent-> fork
------------1st Child(A)-> fork again
-------------------->1st Child's Child(Aa)
如果我父,如何让C程序的孩子的孩子(AA)的pid? 或者如何获得这个组中的所有pid?C程序 - 如何让孩子的孩子PID在父[后叉]
Parent-> fork
------------1st Child(A)-> fork again
-------------------->1st Child's Child(Aa)
如果我父,如何让C程序的孩子的孩子(AA)的pid? 或者如何获得这个组中的所有pid?C程序 - 如何让孩子的孩子PID在父[后叉]
这里没有一个直接的办法让孩子的PID父PID(getppid()
),但 ...
fork()
返回三个值中的一个:孩子PID,0和-1。
fork()
有错误时返回-1。...所以你已经有孩子(rens)pid(s)fork()
之前和之后。例如,如果你想要execl
之后的孩子pid,最简单的方法就是当它由fork()
返回时,即挂在它上面,即;存储它。
如果这对于您来说效率不够,您可以设置一个pipe()
或两个将其传回父级。
int io[2];
pipe(io);
io[0]
is in; io[1]
不存在。您可以使用write()
和read()
。
在linux中,当我输入“ps aux”时,它会显示所有的pid。这个概念可以在C中使用以获得想要的pid吗?还有一个问题:是否可以在组pid内获得所有pid?如果不是,那么group pid有什么用? (因为在C中有一些setpgid) – 2014-10-19 05:00:54
你总是可以从你的C代码中调用它作为'system(“ps aux”);'但是你仍然需要钻研我的想法。我不知道一种方法来获得一个组中的所有pid。 ps上的选项可以做到这一点,但看起来像很多工作,至少比存储它们更多。 – ChiefTwoPencils 2014-10-19 05:31:40
任何这样的方法都有严重的错误识别过程和竞争条件。 – 2014-10-19 05:38:41
这里是使用管道与儿子对应一个小例子:
#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;
}
你根本不可能,除非你有一些IPC方法来传递它了。 – 2014-10-19 04:26:28
孩子可以做零个,一个或多个叉子,没有孩子的孩子。 – 2014-10-19 04:54:03
那么,是否有可能获得组pid内的所有pid?如果不是,那么group pid有什么用? (因为在C中有一些setpgid) – 2014-10-19 04:55:48