Di *_*ang -3 c fork pid process wait
这是测试fork()系统调用的C代码:
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
#include<wait.h>
int main(int argc, char *argv[])
{
printf("I am: %d\n", (int)getpid());
pid_t pid = fork();
printf("fork returned: %d\n", (int)pid);
if (pid < 0)
{
perror("fork failed");
}
if (pid==0)
{
printf("I am the child with pid %d\n", (int)getpid());
sleep(5);
printf("Child exiting...\n");
exit(0);
}
printf("I am the parent with pid %d, waiting for the child\n", (int)getpid());
wait(NULL);
printf("Parent ending. \n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
终端输出是:
I am: 25110
fork returned: 25111
I am the parent with pid 25110, waiting for the child
fork returned: 0
I am the child with pid 25111
Child exiting...
Parent ending.
Run Code Online (Sandbox Code Playgroud)
问题:当fork返回时:0,它在子进程中.但是孩子的过程显示我是pid 25111的孩子.我以为子进程pid应为0,为什么它变为25111?
与父进程相同,fork返回25111,但getpid()返回25110(我是pid 25110的父亲,等待孩子)
子进程显示我是pid 25111的孩子.我认为子进程pid应为0
不.在父母中fork()返回孩子的pid.在孩子中,fork返回0 - 这不是任何东西的pid,它只是一个标记.正如getpid告诉你的,孩子的pid是25111 .
使用父进程,fork返回25111,但getpid()返回25110
对.正如getpid告诉你的那样,父母的pid总是25110 .并fork()归还了新孩子的pid.
在子fork节点中getpid返回的父节点返回相同值的事实证明这一切都正常工作.
听起来你觉得fork()总是会回到你所处的过程的pid.但这没有意义 - 我们已经有了这个getpid要求.
如果您是父级,则fork()返回另一个进程的pid ,即子级.如果你是孩子,fork()根本不会回来.(如果你是孩子而且你想知道你父母的pid,这是一个好的,频繁的,单独的问题.答案:打电话getppid().)
我们可以总结如下:
parent child
------ -----
pid: 25110 25111
fork returns: 25111 0
getpid returns: 25110 25111
getppid returns: ????? 25110
Run Code Online (Sandbox Code Playgroud)
记住这一点的方法是考虑将要调用的代码fork():它将要做什么,需要知道什么.父母需要知道它是父母.孩子需要知道这是孩子.父母经常需要知道孩子的pid(并且没有其他方法可以获得它).
如果fork总是返回一个pid,那么在fork通话之后,查看它的返回值,你将无法知道你是父母还是孩子 - 但这通常是你需要知道的第一个也是最重要的事情.
(在所有这些中,我忽略了第三种可能性,即fork失败,并在父项中返回-1,并且不返回子项中的任何内容,因为没有.)
另请参见为什么fork()在子进程中返回0?.