2010-11-19 93 views
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; 
} 

OUTPUT:

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

如果孩子值变成20为什么从孩子返回后值= 5

回答

4

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

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

+0

如何打印内存地址? – 2010-11-19 15:53:06

+0

@ Bobj-C:你可以使用'printf(“%p”,(void *)&value)打印一个地址;' – 2010-11-19 16:03:19

+0

我在子代和父代PID的相同输出中添加一个十六进制值的代码? – 2010-11-19 16:07:35

0

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

+0

我会犹豫是否要链接该教程。它有很多错误信息和糟糕的风格,其中最糟糕的可能是围绕完全符合标准的代码对'#ifdef __gnu_linux__'进行推荐,而不是在其周围使用'#ifndef BROKEN_OS'并在配置时检查损坏的系统。 – 2010-11-19 15:55:34

+0

同意,它只是说明叉使用的一些可能的影响,也许,以一种严重的方式。 – khachik 2010-11-19 16:00:04

相关问题