1

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

编码:

#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

4

2 回答 2

4

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

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

于 2010-11-19T15:41:43.860 回答
0

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

于 2010-11-19T15:43:10.317 回答