【问题标题】:How is it possible for fork() to return two values?fork() 怎么可能返回两个值?
【发布时间】:2011-05-11 14:17:33
【问题描述】:

既然C语言中的一个函数只返回一个值,那么一直以来,同样是一个函数的fork()怎么可能返回两个值呢?

【问题讨论】:

    标签: c function unix fork


    【解决方案1】:

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

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

    所以更多地把它想象成在每个 thread 进程上调用一个返回。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        它的作用是返回一个值,就像所有函数一样,但它返回两次。

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

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

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

        【讨论】:

          【解决方案4】:

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

          #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;
          }
          

          需要fflush(stdout) 的原因是因为进程被fork 复制,这意味着stdio 为stdout 完成的缓冲也被复制了。第一个打印语句末尾的“\n”可能会使其继续并刷新标准输出,但这不能保证。

          【讨论】:

            【解决方案5】:

            这里的关键见解是考虑以下事实:在fork() 之后,您确实有 两个 程序副本。这是两个进程,运行完全相同的代码副本,执行指针正好位于同一行代码,即fork(),准备返回。

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

            这就是为什么他们说fork() 会返回两次。每个进程一次。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-08-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-07-31
              • 2021-05-04
              相关资源
              最近更新 更多