这是一个有点技术性的问题,如果你了解C语言和UNIX操作系统,或者这可能是一个非常新手的问题,也许你可以帮我一下!
今天在我们的操作系统课程中分析一些代码时出现了一个问题。我们正在学习在UNIX中“fork”进程的含义,我们已经知道它会创建与当前进程并行的进程副本,并且它们拥有独立的数据段。
但是我想,如果在执行fork()之前创建变量和指向该变量的指针,因为指针存储变量的内存地址,所以可以尝试通过使用该指针从子进程修改该变量的值。
我们在课堂上尝试了类似于这样的代码:
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
int main (){
int value = 0;
int * pointer = &value;
int status;
pid_t pid;
printf("Parent: Initial value is %d\n",value);
pid = fork();
switch(pid){
case -1: //Error (maybe?)
printf("Fork error, WTF?\n");
exit(-1);
case 0: //Child process
printf("\tChild: I'll try to change the value\n\tChild: The pointer value is %p\n",pointer);
(*pointer) = 1;
printf("\tChild: I've set the value to %d\n",(*pointer));
exit(EXIT_SUCCESS);
break;
}
while(pid != wait(&status)); //Wait for the child process
printf("Parent: the pointer value is %p\nParent: The value is %d\n",pointer,value);
return 0;
}
如果你运行它,你将会得到类似于这样的结果:
父进程: 初始值为0
子进程: 我会尝试改变这个值
子进程: 指针值为0x7fff733b0c6c
子进程: 我已经把这个值设为1了
父进程: 指针值为0x7fff733b0c6c
父进程: 值仍然是0
很明显,子进程并没有对父进程产生任何影响。实话说,我本来期望会因为访问了未授权的内存地址而出现"段错误",但真正发生了什么呢?
请记住,我不是在寻找进程间通信的方法,那不是重点。我想知道的是代码做了什么。在子进程内部,改变是可见的,所以它确实做了些什么。
我的主要假设是指针不是绝对的内存地址,它们是相对于进程堆栈的。但是我还没有找到答案(课上没有人知道,搜索引擎只能找到一些关于进程通信的问题),所以我想从你这里得到答案,希望有人能知道。
感谢您抽出时间阅读!
printf("Parent: the pointer value is %p\nThe value is %d\n",pointer,value);
放在switch()
的默认情况下。 - Haris