关于fork()函数,谁来解释一下

来源:百度知道 编辑:UC知道 时间:2024/09/20 03:42:24
小弟我敲了这么一段程序
#include .....
int main(void)
{
pid_t pid;
int a = 5;
pid = fork();
if(pid < 0) printf("error!");
else if(pid == 0) {
int b;
printf("%d,%d,%d\n",a,&a,&b);
a++;
} else {wait(NULL);printf("%d,%d\n",a,&a);}
}
有两个地方,
第一,子进程和父进程输出的a的值都是5(初值),这说明父进程没有受子进程那个a++的影响,可以认为父子进程输出a的时候是访问了不同地址的a吗?可我打印他们的地址时是一样的。。。(资料上说父子进程除了代码段都不共享,为什么地址会一样。。)
第二,无论运行多少次,a的地址始终是一样的,而子进程里的b的地址每次运行都不一样,为什么。。。

以上是在linux环境下运行的
希望C语言达人帮忙解答一下,谢谢了

fork()的结果是生成一个新的进程。

新的进程和原来的进程不共享数据。

你把原进程中的a在打印前就另外赋值也不会影响新进程中的a。

两个进程中a的(虚拟)地址一样是因为新进程是原进程的拷贝,除了和进程相关的一些数据不同,其它都一样。

现代操作系统都使用虚拟地址。不同进程都可以使用同样大小的虚拟地址空间(32位操作系统为4G),有操作系统和处理器硬件完成虚拟地址到物理地址的转换。一个进程中的虚拟地址数值在另一个进程中毫无意义,即便两个进程中虚拟地址一样,其物理地址完全不同。

第一,访问的是同一地址,因为传的指针式同一个,地址肯定是一样的了……
第二,a的地址是父进程指向的,b的是临时生成的,每次执行a不变,b会因为在内存内给它分配的地方不同而地址不同

你可以看下《linux高级程序设计》里面有讲解这块的

1. 输出的是同一内存地址的a,Linux内核中有一种称为COPY ON WRITE(写入时复制)的机制,为了节省系统资源,初始派生一个子进程时,父子进程会共享大部分的内存页面,只有在子进程修改父进程的页面时,才会为子进程提供一个新页面,这样子进程对页面的写操作不会影响父进程。测试方法,将a++放在printf的前面试试,这只是推测,可能不正确。
2. 不知道,没有安装Linux系统,所以无法测试。