我对为什么以下两个程序中的子进程显示不同的父对象有点困惑。
int main ( void ) {
int pid, fpid, ppid;
fpid = fork ();
pid = getpid();
ppid = getppid();
printf ("fpid is %d\n", fpid);
sleep(5);
if (fpid > 0){
printf ("\nThis is Parent. My pid %d. My parent's pid %d\n",pid,ppid);
}
else if (fpid ==0){
sleep(1);
printf ("\nThis is Child. My pid %d. My parent's pid %d\n",pid,ppid);
}
else
printf ("fork failed\n");
return (0);
}
输出:
fpid is 53560
fpid is 0
This is Parent. My pid 53559. My parent's pid 44632
MacBook-Pro:~/Desktop/$
This is Child. My pid 53560. My parent's pid 53559
int main ( void ) {
int pid, fpid, ppid;
fpid = fork ();
printf ("fpid is is %d\n", fpid);
sleep(5);
if (fpid > 0){
pid = getpid();
ppid = getppid();
printf ("\nThis is Parent. My pid %d. My parent's pid %d\n",pid,ppid);
}
else if (fpid ==0){
sleep(1);
pid = getpid();
ppid = getppid();
printf ("\nThis is Child. My pid %d. My parent's pid %d\n",pid,ppid);
}
else
printf ("fork failed\n");
return (0);
}
输出:
fpid is is 53635
fpid is is 0
This is Parent. My pid 53634. My parent's pid 44632
MacBook-Pro:~/Desktop$
This is Child. My pid 53635. My parent's pid 1
我理解,进程1是在原始父进程终止后作为父进程接管的进程。我想我想知道的是:在子进程在两种情况下都可以处理其printf
之前父进程是否已完成?不应该输出相同吗?
答案 0 :(得分:3)
由于父进程和子进程并发运行,执行顺序取决于运行时。其中一个可以提前完成。如果父级在子级到达getppid()
之前完成,则子进程将由init
采用。因此父母身份1.
要查看孩子的实际父进程ID:
wait()
或waitpid()
或sleep(120)
。答案 1 :(得分:1)
是不是父进程在子进程在两种情况下都可以处理它的printf之前完成的?
非常可能如此,但并非绝对肯定。你不能<{>}确保 CGFloat(2)
任何时间。
输出不应该相同吗?
他们可以相同,但他们不太可能。重要的是要注意每个程序self.startingPoint
的调用时间。报告的父进程ID是在呼叫时应用的进程ID;当值打印时,它不一定适用于以后。