【发布时间】:2017-02-10 03:41:02
【问题描述】:
我有点困惑为什么以下两个程序中的子进程显示不同的父 ID。
第一个程序:
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 之前完成?输出不应该一样吗?
【问题讨论】:
-
您在第二个程序中的孩子中有一个
sleep(1)。因此,当您执行getppid()时,父级将终止。这就是你得到 1 的原因。第一个程序是在睡觉前获取 ppid,这就是你得到正确值的原因。 -
在您的第一个示例中,您会立即获得 ppid,因此父级尚未退出。
-
一般来说,当父进程创建子进程时(例如通过调用
fork(),父进程应该在子进程退出之前始终不退出。这通常由父进程调用wait()来完成或waitpid() -
进程 id 1 是(在 linux 中)
init()函数,它从一开始就运行,直到系统关闭或重新启动。在现代系统中,当子进程的父进程在子进程之前退出时,init()进程会获取子进程。但是,一般来说,当父进程先退出时,子进程就变成了zombie进程,这意味着它不能被杀死、删除等,除非重新启动计算机。
标签: c linux fork child-process