-1

次のコードを実行すると

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
    pid_t pid;
    pid = vfork();
    printf("hello world\n");
}
Output:
hello world
hello world
hello world
Segmentation fault

exec() または _exit() が呼び出されない限り、変数を変更しようとすると vfork() が奇妙な動作をする可能性があることは知っていますが、正確に何が起こっているのか誰か説明してもらえますか?? hello world が 3 回印刷されるのはなぜですか? printf() がバッファリングされているためですか?そして最後に、親が戻ろうとしているときにセグフォルトが発生するのはなぜですか?

4

2 に答える 2

0

私が書いたコードは惨事であり、未定義の方法で動作しますが、そのような動作のもっともらしい説明は次のとおりです。

アドレス空間は共有されており、子が_exit()またはによって返されない場合exec()、I/O バッファのフラッシュが実行され (余分な hello world ステートメントが発生します)、クリーンアップ プロセス中にメモリprintf()が解放されると、親がまだスタックしている間に、関数呼び出しをスタック フレームに置きます。返されたときに、親がスタック上に戻りアドレスを持っていない可能性があり、その結果、セグメンテーション違反が発生します。

于 2016-08-06T05:11:05.537 に答える