我简化你的程式:
#include <unistd.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
char *ptr="abcdef";
pid_t pid;
pid = fork();
if (pid == 0)
{
printf("child ptr: %p\n", ptr);
}
else
{
printf("parent ptr: %p\n", ptr);
}
return 0;
}
执行结果:
parent ptr: 0x400624
child ptr: 0x400624
我在 Ubuntu 16.04.1 LTS 测试。
gcc 8.1
gcc -g -fno-pic f.c -o f
ptr 在 parent process 和 child process 都是一样的位址。
反组译
char *ptr="abcdef";
400551: 48 c7 45 f8 24 06 40 movq $0x400624,-0x8(%rbp)
ptr 位址是 0x400624, 看以下的反组译 0x400624, 0x61, 0x62 ~ 0x66,
就是 "abcdef"
400620: 01 00 add %eax,(%rax)
400622: 02 00 add (%rax),%al
400624: 61 (bad)
400625: 62 63 64 65 66 (bad) {%k5}
这整段 machine code 在 fork 之后还是长这个样子, 所以印出来的 ptr 这个值
自然会是一样的。
如果你想知道 fork 怎么实作, 可以参考 Orange's 一个作业系统的实现, 里头有一章
在说明 fork 是怎么实作的。
如果你不是在这环境测试, 可能无法得到这结果, 我不知道为什么在
我的 debian, link 出来的位址和执行位址竟然不同。
※ 引述《b10007034 (Triven)》之铭言:
: https://i.imgur.com/MjKHbOu.png
: https://i.imgur.com/iUkvs5x.png
: 我照着图中程式在Ubuntu 18.04.3执行,有几个疑问想请教
: 为什么child跟parent 的variable’s address一致呢?我以为copy on write会使得它们不
: 一样
: 承上题,一样的address不会造成它们aliasing吗?
: 谢谢看完!