C fork()如何返回两个值?

C fork()如何返回两个值?,c,function,unix,fork,C,Function,Unix,Fork,由于C中的函数始终只返回一个值,因此也是函数的fork()如何返回两个值?fork函数将0返回给创建的子进程,并将childs ID返回给父进程 这两个独立的进程各自返回一个值 因此,可以将其看作是在每个线程进程上调用一个返回。fork不返回两个值。在fork系统调用之后,您只需要有两个独立的进程执行相同的代码,从fork返回的pid是区分您在哪个进程中的唯一方法-父进程还是子进程。正如Gnostus所说,fork()函数不返回两个值 它只返回一个值,就像所有函数一样,但返回两次 一次在父进程内

由于C中的函数始终只返回一个值,因此也是函数的
fork()
如何返回两个值?

fork函数将0返回给创建的子进程,并将childs ID返回给父进程

这两个独立的进程各自返回一个值


因此,可以将其看作是在每个线程进程上调用一个返回。

fork
不返回两个值。在
fork
系统调用之后,您只需要有两个独立的进程执行相同的代码,从
fork
返回的pid是区分您在哪个进程中的唯一方法-父进程还是子进程。

正如Gnostus所说,fork()函数不返回两个值

它只返回一个值,就像所有函数一样,但返回两次

一次在父进程内,一次在子进程内。父进程获取返回给它的子进程ID,子进程获取0-一个无效的进程ID,因此代码可以告诉它是子进程

子进程是一个新进程,运行相同的代码,并且与生成它的父进程位于代码中的相同位置

int cProcessID;

cProcessID = fork();

if (cProcessID == 0) {
    // Child process
} else {
    // Parent process
}

如果您阅读、构建和运行以下程序,您应该对正在发生的事情有更好的了解

#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;
}
#包括
#包括
内部主(空){
pid_t fk;
printf(“\t fork my pid=%lu\n”之前,(无符号长)getpid());
fflush(stdout);/*这可能会保留上述打印内容
语句从输出两次*/
fk=fork();/*操作系统内核在此处复制当前进程*/
printf(“fork返回%lu,现在我的pid=%lu\n”,
(无符号长)fk,(无符号长)getpid();
返回0;
}

之所以需要
fflush(stdout)
,是因为该进程由fork复制,这意味着stdio为stdout执行的缓冲也被复制。第一个print语句末尾的“\n”可能会使它继续并刷新stdout,但这不能保证

这里的关键洞察是思考这样一个事实,即经过
fork()
之后,您实际上有两个程序副本。这是两个进程,运行相同的代码副本,执行指针正好位于相同的代码行,即
fork()
,准备返回

操作系统安排
fork()
在父进程中返回子进程的pid,并在子进程中返回零(如果一切顺利)

这就是为什么他们说
fork()
返回两次。每道工序一次