【问题标题】:Can't understand the value of a variable after fork()fork() 后无法理解变量的值
【发布时间】:2021-05-30 05:00:28
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include<sys/wait.h> 


int main(){
    int num = 2;
    
    if (!fork()){
        num++;
        printf ("First: num = %d\n", num);
    }else{
        wait(NULL);
        if (!fork()){
            num++;
            printf ("Second: num = %d\n", num);
        }else{
            wait(NULL);
            num++;
            printf ("Third: num = %d\n", num);
            fflush(stdout);
            exit(0);
        }   
    }       
    fflush(stdout);
}

有人可以解释为什么 num 最终是 3 吗?我在 fork() 上找不到很好的解释。 (!fork()) 甚至有什么作用??

【问题讨论】:

  • '我找不到关于 fork() 的好解释。 (!fork()) 甚至做了什么?? - 我发现这些陈述/问题与可以通过参考印刷文献和搜索引擎检索到的在线资源来验证和证明的事实之间没有相关性。
  • OT:函数fork()有三种返回值1)>0表示在父进程中。 2) =0 表示在子进程中。 3)
  • 建议阅读:fork。顺便说一句:如果你不知道fork() 的作用,你为什么还要使用它?
  • @user3629249:OP 没有使用fork。这是他们正在检查的代码,而不是他们正在编写的代码。

标签: c operating-system fork


【解决方案1】:

fork 是一个复制进程的 Unix 系统调用。程序继续运行两次,一次在父进程中,一次在新的子进程中。在子进程中,fork 返回零,这就是子进程如何知道它是子进程。在父进程中,它返回子进程的进程标识号。 (如果发生错误,则返回-1。)

这段代码:

if (!fork()){
        num++;
        printf ("First: num = %d\n", num);

说要创建一个孩子,然后在孩子中增加num 并打印它。 (在孩子中,fork 返回零,所以!fork() 为真。)

此时num在parent中还是2,因为fork执行的时候是2,而child中的num++增加了child的副本,并没有影响到parent的@ 987654330@.

else代码中:

wait(NULL);
if (!fork()){
    num++;
    printf ("Second: num = %d\n", num);

wait(NULL) 表示等待所有子进程完成执行,然后再创建另一个子进程。那个孩子做和上面一样的事情。由于它在创建时在num 中有 2,因此递增产生 3,子打印 3。

第三段代码做同样的事情。 fflush 调用是不必要的。

【讨论】:

    【解决方案2】:

    Fork 将根据您使用代码创建的进程创建一个新进程。因此,当 fork 创建一个新进程时,它将返回 0 表示成功。

    这就是输出 3 的原因。

    可以在这里找到 fork 工作原理的详细说明:Fork-doc

    【讨论】:

      猜你喜欢
      • 2016-12-07
      • 2012-04-29
      • 2023-03-25
      • 2011-05-26
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 2016-02-29
      • 1970-01-01
      相关资源
      最近更新 更多