これは "APUE" の第 8 章 (演習 8.2、第 2 版) の演習です。すべての説明は次のとおりです。
図 7.6 の典型的なメモリ配置を思い出してください。各関数呼び出しに対応するスタック フレームは通常スタックに格納され、vfork の後に子は親のアドレス空間で実行されるため、vfork の呼び出しが main 以外の関数からのもので、子がそれを実行するとどうなるかvfork 後のこの関数からの戻り? これを検証するためのテスト プログラムを作成し、何が起こっているかを図で示します。
私のプログラムでは:
static void f1(void), f2(void);
int main(void) {
printf("main address: %d\n", main);
f1();
f2();
_exit(0);
}
static void f1(void) {
printf("f1 address: %d\n", f1);
pid_t pid;
if ((pid = vfork()) < 0)
err_sys("vfork error");
}
static void f2(void) {
printf("f2 address: %d\n", f2);
char buf[1000];
int i;
for (i = 0; i < sizeof(buf); ++i)
buf[i] = 0;
}
プログラムを実行すると、出力は次のようになります。
main address: 4196560
f1 address: 4196604
f2 address: 4196663
f1 address: 4196604
[1] 12929 segmentation fault ./a.out
出力について混乱しています。
- print
f1 address: xxx、 vfork() を呼び出し、子プロセスが最初に実行されます。 - print
f2 address: xxx、次に子プロセスが _exit(0) を呼び出します。 - f1() からの主な進行状況の戻り時に、f1 のスタック フレームが f2 によって変更されたため、セグメンテーション フォールトが発生する可能性があります。
しかし、なぜf1 address: 41966042 回出力し、なぜ f1 と f2 のアドレスが同じでないのでしょうか?