c - 为什么这个使用 fork 和共享内存的 C 程序的输出是这样的?

标签 c process operating-system fork shared-memory

我有一个旧考试的问题,给定一个 C 代码,m 是全局变量,当程序完成 m 的值时,答案是“7 到 19 之间”,但我不明白为什么,有人可以解释吗对我来说,为什么答案是在 7-19 之间而不是 19。

int m = 0;

int main() {
    int i;

    fork();
    m=3;
    fork();
    for(i=0;i<4;i++)
        m++;
}

最佳答案

首先要注意的是,分析这个问题是没有阻塞调用,这意味着当主进程到达main末尾时,无论其他进程处于什么状态,程序都会完成。

利用这一事实,我们可以算出 m 的下限:这将是当主进程退出之前 fork 进程不更改 m 的值时。在本例中,m 将从 3 开始,并在循环中添加 4 次,从而得出 m = 7 的下限。

当所有进程在进入循环之前都已生成时,就会出现上限,然后每个进程都会向 m 添加 4(起始值为 3)。换句话说,m = 3 + N*4,其中 N 是生成的进程总数。

因此,为了最终获得上限,我们需要知道生成了多少个进程。第一次调用 fork() 会将一个进程变成两个,随后调用 fork() 会将每个进程变成两个,这意味着 N = 4

使用之前的 m 表达式,我们发现上限为 m = 3 + 4 * 4 = 19

关于c - 为什么这个使用 fork 和共享内存的 C 程序的输出是这样的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40103750/

相关文章:

c - 递归方法不适用于二叉搜索树

c - 使用 gdb 调试 Linux 内核模块

android - 如何知道双 SIM 安卓手机中哪个 SIM 卡正在消耗移动数据?

operating-system - 在具有 1GB 物理内存和 8KB 页面大小的 32 位系统上,帧和偏移量需要多少位?

c# - 如何将同一个应用程序部署到多个服务器

memory-management - Linux内核设置GDT的位置

c - 使用MapViewOfFile,指针最终走出内存空间

c - 如何按值将结构传递给 pthread?

c# - 使用 C# 和 WinForms 在自己的进程中的选项卡

c - 我正在使用 PID 创建一个终止进程