【问题标题】:fork() call, duplicating processesfork() 调用,复制进程
【发布时间】:2011-06-17 23:11:44
【问题描述】:

fork() 用于创建子进程...您会看到此调用也出现在子进程中。当他们说'调用 fork 实际上返回两次'时,我不明白这意味着什么。

这是什么意思...

if (fork() == 0)
/* the child process's thread executes here*/

else 
/*the parent process's thread executes here*/

上面的代码部分是父母还是孩子。你能用简单的英语解释发生了什么吗?

另外,为什么要使用fork()?它说unix中的所有进程都由这个系统调用运行?你如何fork() 以便其他程序可以运行?您指定程序的名称吗?

【问题讨论】:

    标签: fork process


    【解决方案1】:

    有点像这样:

    Process 1               Process 2
    
    int main() {
      ...
      int x = goo();
      ...
      int y = fork();
      // fork() returns...    // ... but also here!
    
      // here y = 123         // here y = 0
      if (y) {                if (y) {
        // this happens         // false
      } else {                } else {
        // false                // this happens
      }                       }
    
      int z = baz();          int z = baz();
      ...                     ...
      return 0;               return 0;
    }                       }
    

    当进程 2 启动时,程序存在两次,第二个进程以 fork() 的返回开始。由于程序在两个进程中都是相同的,所以区分你在哪个进程的唯一方法是通过 fork() 的返回值。

    【讨论】:

      【解决方案2】:

      他们说它返回两次的意思是调用在父进程(调用它)中返回一次,在子进程中返回一次(虽然你可能会争辩说子进程继承了从父级调用fork 的行为就像它继承了很多其他东西一样)。

      sn-p 代码利用了从fork 获得不同返回值的事实,具体取决于您是父进程还是子进程。

      子进程得到零,父进程得到子进程的非零进程ID。

      如果 fork 由于某种原因失败,您也可以返回 -1,在这种情况下,孩子将不会运行。这也是您应该检查的内容。

      而且,虽然fork 用于创建新的进程,它是exec 系列调用将新的程序加载到这些进程中:fork on它自己做不到。

      可以在here找到一个很好的过程概述。

      【讨论】:

        猜你喜欢
        • 2020-07-27
        • 2018-05-08
        • 2016-01-13
        • 2019-05-05
        • 1970-01-01
        • 2020-03-13
        • 1970-01-01
        • 2012-01-13
        • 1970-01-01
        相关资源
        最近更新 更多