我是C的新手,我对fork()
函数的返回值结构感到困惑。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
pid_t childPid;
childPid = fork();
printf("%d\n",childPid);
return EXIT_SUCCESS;
}
输出结果为:
28501
0
由于pid_
t是int
类型,childPid
如何有2个值?
答案 0 :(得分:6)
您实际上看到了两个可执行文件副本的输出。当您调用fork()
时,进程会自行克隆,并提供两个进程。父对象将子进程的PID作为返回值,子进程返回0作为返回值。
诀窍是,克隆共享 STDIN,STDOUT和STDERR。当父进入printf时,它会打印出它拥有的值,就像子进程一样,所以你看到两个PID,两个进程共享相同的STDOUT - 在你的程序中没有明显的方法可以区分它们。
尝试将其重写为:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
pid_t childPid;
childPid = fork();
if(childPid != 0)
printf("I'm the parent and my child PID is %d\n",childPid);
else
printf("\tI'm the child, so I received %d\n",childPid);
return EXIT_SUCCESS;
}
你会更清楚地看到这一点。
要获得额外的功劳,请查看wait()
系统调用,并使用它来使父级在子级之后终止。
答案 1 :(得分:6)
成功fork
后,您有两个进程,父进程(forker)和子进程。新创建的进程(子进程)的返回值为0
。这是孩子的信号。
所以你看到父进程打印了孩子的实际pid,子进程打印0
。这是按预期工作的,除非我在你的问题中遗漏了什么?