ここでfork()について理解しています。 fork()システムコールは、親プロセスから子プロセスをスピンオフします。子プロセスのコアイメージ(アドレス空間)は、親プロセスのものとまったく同じです。アドレス空間には、次のものが含まれます。フォーク時の書き込み時コピー
- スタック
- テキストセグメント(プログラムを含む)。
- データセグメント(変数を含む)。
しかし、プロセスのいずれか(親または子)がそのアドレス空間に書き出しを開始するまで、コピーは実際には実行されません。子が別のアドレス空間に割り当てられるのは、それだけです。
私は私の理解をテストするためのプログラムを書いて、その結果は、私が何か欠けている可能性があります示しています。ここ
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
pid_t pid;
pid=fork();
int a=5;
if(pid<0){/*error condition*/
printf("Error forking\n");
}
if(pid==0){/*child process*/
printf("Child process here\n");
a=a+5;
printf("The value of a is %d\n",a);
printf("The address of a is %p\n",&a);
printf("Child terminated\n");
exit(getpid()); /*child terminates*/
}
else{/*parent process*/
printf("Parent blocked\n");
wait(NULL); /*waiting for child process to exit*/
printf("Parent process here");
printf("The value of a is %d\n",a);
printf("The address of a is %p\n",&a);
printf("parent terminated");
}
}
は、上記のプログラムの出力です:
Parent blocked
Child process here
The value of a is 10
The address of a is 0x7ffe4c37b1a0
Child terminated
Parent process hereThe value of a is 5
The address of a is 0x7ffe4c37b1a0
誰かがに説明することができますなぜ私は両方のアドレスが同じですか?子プロセスはその変数を更新したので、別のメモリ位置に割り当てられているはずです。
子供は親のコピーであることを忘れないでください。これには*メモリマップ*が含まれます。 –
仮想アドレスはpyhsicalではなく同じです。 – mch
Blimey。私はそれを認識しませんでした。実際の住所を見ることはできませんか? –