我决定学习C,这是我使用的其中一本书的摘录:
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
pid_t result = fork();
if (result == -1){
fprintf(stderr, "Error\n");
return 1;
}
if (result == 0)
printf("I'm a child with PID = %d\n", getpid());
else
printf("I'm a parent with PID = %d\n", getpid());
return 0;
}
它的输出是:
I'm a parent with PID = 5228
I'm a child with PID = 5229
一切都很清楚,但同时result == 0
和result != 0
怎么可能呢?看起来这个变量存储了两个值,因为printf
指令执行了两次。我知道,fork()
返回0
和父亲的PID,但result
如何检查它是否在不同条件下返回true?
答案 0 :(得分:7)
因为它的不是相同的变量。当您fork
进程时,您最终会得到两个完全不同的流程(有关详细信息,请参阅this answer)。
因此,父级中的result
变量与子级中的变量不同。你所看到的是两个进程,它们都连接到同一个输出设备,每个进程都写自己的消息。
事实上,fork
文档专门涵盖了:
成功时,父进程返回子进程的PID,并在子进程中返回0。
因此,您可以使用fork
的返回值(就像您一样)来查看您是父母还是孩子(并查看它是否也有效,它会返回{ {1}}如果失败,您将成为否孩子的父母。
这个想法是父母获得孩子的进程ID,因此它可以用它来做某事(比如-1
完成它)并且孩子得到零。通过调用wait()
,孩子总是可以获得父母的进程ID。
答案 1 :(得分:3)
变量一次只能包含一个值。您正在看到的是因为fork()
正在创建另一个流程:现在有两个程序正在运行;一个result == 0
(产生的过程),另一个result != 0
(原始过程)
答案 2 :(得分:2)
fork
复制来自父母的孩子。因此,新创建的子类从父级继承了共享内存,消息队列,文件流等几个属性。因此,当您调用fork
时,会创建另一个具有另一个变量结果的进程。
答案 3 :(得分:2)
fork()
功能会创建一个新的进程,在此行之后,您的程序会从该位置拆分为2。因为你需要知道你是哪个进程,如果你是子进程,函数返回0,如果你是父进程,则返回一些pid。
来自手册页:
成功时,子进程的PID将在父进程中返回,并且 孩子返回0。失败时,在父级中返回-1, 没有创建子进程,并且正确设置了errno。
答案 4 :(得分:1)
fork()函数将创建一个新进程。在父进程中,fork()将返回子进程的pid,因此“result”变量不会等于0,而在子进程中,fork()只返回0,所以“result”为0。