次のコードは決して終了しません。何故ですか?
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#define SIZE 5
int nums[SIZE] = {0, 1, 2, 3, 4};
int main()
{
int i;
pid_t pid;
pid = vfork();
if(pid == 0){ /* Child process */
for(i = 0; i < SIZE; i++){
nums[i] *= -i;
printf(”CHILD: %d “, nums[i]); /* LINE X */
}
}
else if (pid > 0){ /* Parent process */
wait(NULL);
for(i = 0; i < SIZE; i++)
printf(”PARENT: %d “, nums[i]); /* LINE Y */
}
return 0;
}
アップデート:
このコードは、 に関するいくつかの混乱を説明するためのものvfork()
です。を使用するvfork()
と、子プロセスが親のアドレス空間をコピーしないようです。代わりに、アドレス空間を共有します。その場合、両方のプロセスによって nums 配列が更新されると予想されますが、私の質問はどのような順序ですか? OS は 2 つの間でどのように同期しますか?
コードが終了しない理由については、おそらく終了用に明示的に_exit()
orexec()
ステートメントを持っていないためです。私は正しいですか?
UPDATE2:
読んだところ: 56. fork() と vfork() システム コールの違いは?
この記事は、私の最初の混乱を解決するのに役立つと思います。
vfork() システム コールからの子プロセスは、親のアドレス空間で実行され (これにより、親のデータと stack が上書きされる可能性があります)、子プロセスが終了するまで親プロセスが中断されます。