Orb*_*ing 13
正如Gnostus所说,fork()函数不会返回两个值.
它的作用是返回一个值,就像所有函数一样,但它会返回两次.
一旦在父进程内,一旦在子进程内.父进程获取返回给它的子进程ID,子进程为0 - 进程ID无效,因此代码可以告诉它是子进程.
子进程是一个新进程,运行相同的代码,并且与生成它的父进程位于代码中的相同位置.
int cProcessID;
cProcessID = fork();
if (cProcessID == 0) {
// Child process
} else {
// Parent process
}
Run Code Online (Sandbox Code Playgroud)
nat*_*ose 10
如果您阅读,构建并运行以下程序,您应该更好地了解正在发生的事情.
#include <stdio.h>
#include <unistd.h>
int main(void) {
pid_t fk;
printf("\tbefore fork my pid = %lu\n", (unsigned long)getpid() );
fflush(stdout); /* This may keep the above print
statement from outputing twice. */
fk = fork(); /* The OS kernel makes a copy of the current process here */
printf("fork returned %lu and now my pid = %lu\n",
(unsigned long)fk, (unsigned long)getpid() );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
需要的原因fflush(stdout)是,因为fork会复制进程,这意味着stdio对stdout的缓冲也是重复的.第一个print语句末尾的"\n"可以使它继续并刷新stdout,但这不能保证.
这里的关键见解是考虑一下这样一个事实,即fork()你真的有两个程序副本.这是两个进程,运行相同的代码副本,执行指针正好在同一行代码中,即fork()准备返回.
操作系统安排fork()在父进程中返回子进程的pid,并使其在子进程中返回零(如果运行顺利).
这就是他们说fork()两次返回的原因.一旦进入每个过程.