【问题标题】:can anyone explain this output (operating system)?谁能解释这个输出(操作系统)?
【发布时间】:2010-11-19 15:34:33
【问题描述】:

在学习操作系统课程时,我不明白为什么下面的代码输出会这样

代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h> 

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

    int value = 5;


    pid_t pid = fork();
    printf("pid = %d \n",pid);
    if (pid == 0){
        value+=15;      
        printf("Value ch :%d \n",value);
    }
    else {
        if (pid > 0) {
            wait(NULL);
            printf("Value pr :%d \n",value);
            exit(1);
        }

    }

    return 0;
}

输出:

run
[Switching to process 24752]
Running…
pid = 24756 
pid = 0 
Value ch :20 
Value pr :5 

如果子值变成 20,为什么从子值返回到 5 后

【问题讨论】:

    标签: c operating-system pid


    【解决方案1】:

    因为fork() 创建了一个新进程,拥有自己的地址空间。该地址空间由原始地址空间内容的副本填充。因此,在一个进程中所做的更改不会影响另一个进程。

    换句话说,这是因为进程不共享内存(除非您明确强制它们使用mmap() 等等)。

    【讨论】:

    • 如何打印内存地址?
    • @Bobj-C: 你可以用printf("%p", (void*)&amp;value);打印地址
    • 我在子 PID 和父 PID 的相同输出中添加了一个十六进制值,所以?
    • @Sam Hoice:内存地址将是相同的,因为它们位于虚拟地址空间中。
    • 我没有意识到这一点,但我认为这是有道理的。
    【解决方案2】:

    因为父进程内存被复制到子进程并且子进程内存的进一步更改不会影响父进程。 fork pitfalls 很有趣。

    【讨论】:

    • 我不愿意链接该教程。它有很多错误信息和不良风格,其中最糟糕的可能是向#ifdef __gnu_linux__ 推荐完全符合标准的代码,而不是在它周围使用#ifndef BROKEN_OS 并在配置时检查损坏的系统。
    • 同意,它只是说明了使用 fork 的一些可能影响,也许,以一种糟糕的方式。
    猜你喜欢
    • 1970-01-01
    • 2017-09-12
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多