【问题标题】:Some explanation of the behavior of the fork system call?对 fork 系统调用行为的一些解释?
【发布时间】:2017-07-06 19:39:34
【问题描述】:

我正在为操作系统考试而学习,现在我看到了 fork() 系统调用行为的代码。主要目标是绘制此代码生成的进程树。我做到了,但是我无法解释,因为当我运行此代码时,它会打印 6 次 glob 的值,其中两个不同,而所有其他都相等。为什么会这样?它不应该打印单个 glob 值(准确地说是变量 glob 的值 2) ?谢谢大家!

这是代码:

int main(int argc,char* argv[]){

int glob=5;
int pid=0;

pid=fork();
glob--;
pid=fork();
glob--;

if (pid!=0) {
    pid=fork();
    glob--; } 

printf("Value=%d\n",glob);

return 0;
}

【问题讨论】:

  • 您是否尝试过使用铅笔在纸上跟踪执行并以这种方式跟踪值?
  • glob”只是一个元变量名,比如foo吗?它的选择不是很好,因为它会遮蔽 POSIX standard function,这可能会造成混淆。这不是您看到的问题,但令人困惑。

标签: c linux operating-system fork


【解决方案1】:

您从流程 1 开始。

第一次调用fork 会创建一个新进程 - 2。

现在,1 和 2 继续运行。再次调用fork,您现在已经创建了进程3和4。

现在检查返回的 pid 是否为 0。如果不是(不会在进程 1 和 2 中),则在进程 1 和 2 中再次调用 fork 并创建进程 5 和 6。

进程 1、2、3、4、5 和 6 现在调用 printf

【讨论】:

  • 在我的工作表上创建了图表。从进程 A 开始glob 是 4。现在 A 和 B 现在分别在 C 和 D 中分叉,对于 C 和 D,glob 是 4。在“glob--”之后,所有进程的 GLOB 都是 3。现在开始 IF 构造。这仅考虑进程父亲,因此 A 和 B 进程。在此语句中,A 和 B 分叉分别创建进程 E 和 F,然后将 GLOB 变量减少到 2。现在所有进程都打印 Glob 值。对于 A 和 B,值为 2,而对于其他 3.对吗?
  • @user5508485 glob 对于进程 A B E F 是 2,对于 C D 是 3
  • 为什么会这样?if语句中的fork系统调用是在“glob--”之前调用的,因此进程E和F应该是GLOB = 3。
  • @user5508485 因为 E 和 F 在其 3 时从父进程继承 glob。然后它们还从创建它们的位置继续并减少 glob。
  • @TonyTannous 那么 IF 语句中的“glob--”也考虑到上一步创建的子进程 E 和 F?
【解决方案2】:

因为你正在创建一个三个重复的进程,那么原始和重复的进程操作同时发生,一些操作比其他操作花费的时间更长。

【讨论】:

    【解决方案3】:

    第一次调用fork() 后,您有两个进程,变量glob 递减为4

    第二次调用fork() 后,您有四个进程,变量glob 递减为3

    但是,只有在第二次调用中作为父母的那些(他们从第二次调用fork() 收到!= 0,这总共是两个进程)对fork() 进行第三次调用(变成四个进程)并将变量glob再次递减为2---这就是,父母和孩子,一共四个进程,一共六个)

    所以总共六个进程中只有四个进程,对glob 进行第三次递减,因此,您期望四个2 值和两个3 值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 2015-02-21
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      相关资源
      最近更新 更多