我簡化你的程式:
#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嗎?
: 謝謝看完!