【问题标题】:How does fork work on this program?fork 在这个程序上是如何工作的?
【发布时间】:2023-04-11 07:21:01
【问题描述】:

我有这个程序

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int x =1;
    int* y = malloc(sizeof(int));
    *y = 2;

    if (fork()==0)
        x++;

    if (fork()==0)
        (*y)++;

    printf("%d", (x+*y));
}

这是输出 3445。这是我目前所知道的,fork() 创建了一个新的子进程。如果是子进程,则 fork() 返回 0,如果是父进程,则返回 PID。因此,一旦您调用 fork(),它就会成为父进程,并且 fork()==0 仅在子进程而不是父进程上为真。谁能让我更深入地了解实际发生的情况,以便我获得该输出?

【问题讨论】:

  • 用笔和纸坐下。 (记住你fork() 两次导致printf 被执行4 次。)

标签: c process malloc fork


【解决方案1】:

绘制一个图表显示子父关系和它们的统计数据是有帮助的,这是一种可能的形式(C 代表孩子,P 代表父母):

fork()
  C (x == 2, *y == 2)
  fork()
    C (x == 2, *y == 3) ==> print 5
    P (x == 2, *y == 2) ==> print 4
  P (x == 1, *y == 2)
  fork()
    C (x == 1, *y == 3) ==> print 4
    P (x == 1, *y == 2) ==> print 3

因此将打印 5、3、4、4 的组合,确切的组合取决于这些 printf() 被调用的顺序,可能因运行而异。 p>

【讨论】:

    【解决方案2】:

    fork() 出错时返回 -1,所以你也必须检查它。 所以最好这样做:

    int pid;
    
    pid = fork();
    
    if (pid == 0)
    {
        //child process code goes here
    }
    if (pid > 0)
    {
        //parent process code goes here
    }
    

    请注意,您在第一次 fork() 之后拥有的两个进程然后再执行一次 fork(),因此您最终会得到 4 个进程。

    当然,它们的执行顺序是未定义的,因此每次运行时都会得到 3、5 和一对 4 的不同组合。

    另外,请注意,如果您不在 fork() 之前调用 flush(...),某些 printf(...) 和 fork() 组合可能会导致奇怪的输出。

    最后,你忘记了最后释放(y),所以每次运行这个程序时你都会泄漏 4*sizeof(int) 个字节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-22
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 2017-01-28
      • 2013-02-12
      相关资源
      最近更新 更多