可能重复:
fork()如何返回两个值?
我是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;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
28501
0
Run Code Online (Sandbox Code Playgroud)
由于pid_t是一个int类型,如何childPid有2个值?
您实际上看到了两个可执行文件副本的输出.当您调用时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;
}
Run Code Online (Sandbox Code Playgroud)
你会更清楚地看到这一点.
要获得额外的功劳,请查看wait()系统调用,并使用它来使父级在子级之后终止.
成功后fork,您有两个进程,父进程(forker)和子进程.新创建的进程(子进程)获得的返回值为0.这是孩子的信号.
所以你看到父进程打印了孩子的实际pid,以及子进程打印0.这是按预期工作的,除非我在你的问题中遗漏了什么?