【问题标题】:Pid after fork in C [duplicate]C中分叉后的Pid [重复]
【发布时间】:2018-07-30 21:40:38
【问题描述】:

我用 C 编写了这个简单的代码来模拟 Linux 中的 fork 之后发生的情况

#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>

int value = 5;
int main()
{
    pid t pid;
    pid = fork();
    if (pid == 0) { /* child process */
        value += 15;
        return 0;
    }
    else if (pid > 0) { /* parent process */
        wait(NULL);
        printf("PARENT: value = %d",value); /* LINE A */
        return 0;
    }
}

即使我不明白 fork() 如何成功地为父进程和子进程提供不同的 PID,它也可以工作。它是否连接到父进程和子进程之间的“共享内存段”? 能解释一下吗?

【问题讨论】:

  • 看来你走得太快了。你是在暗示它不应该工作,因为你不理解它。放慢脚步,了解更多基本概念,然后尝试学习 fork() 和/或线程。
  • fork() 调用操作系统内核的功能。内核复制该进程,为新进程分配一个未使用的 ID,并使fork() 在两个进程中返回不同的值。除了由内核管理的父子关系之外,这两个进程是独立的并且彼此独立运行。没有“共享内存段”

标签: c linux fork


【解决方案1】:

成功调用fork 后,将创建一个与调用进程完全相同的新进程。所以这个函数实际上返回了两次,一次给父母,一次给孩子,父母的返回值为孩子的PID,孩子的返回值为0。

但是,新进程不会与父进程共享数据。所有构造,包括堆栈和全局变量,都与父级中的构造不同。

在这种情况下,子进程将 15 添加到 value。但是,此变量与父进程中的 value 完全分开。所以当父级打印value时,它会打印出父级拥有的值,即5。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 2014-12-14
    • 2018-03-03
    相关资源
    最近更新 更多