Unixのプロセスはどの時点で終了しますか?プロセスを終了するには、プログラムまたはexit(0)
同じコマンドを作成する必要がありますか?return 0
私の問題は、次のコードが原因で発生します。
pid_t pid=fork();
if(pid < 0)
{
perror("Fork error\n");
return 1;
}
else if (pid==0) /* child */
{
printf("CHILD My pid is:%d\n",getpid());
}
else /* parrent */
{
wait(NULL);
exit(0);
}
この例では、子プロセスで呼び出さずexit(0)
(したがってプロセスを終了しないと思います)、親プロセスから呼び出しますwait(NULL)
(したがってプロセスが終了するまで待つ必要があります)。プログラムが終了するので、論理的にサブプロセスはある時点で終了します。子プロセスがいつ終了するかを説明できますか?子供が後で終了する場合
else if (pid==0) /* child */
{
printf("CHILD My pid is:%d\n",getpid());
}/* Probably the child process terminates here but then what is the point of using exit(0) */
だから、それを使用するポイントは何ですかexit(0)
?
答え1
ACプログラムは、次の3つの状況のいずれかで終了します。
- プログラムは
main
関数から返されます。戻り値が 0 の場合は成功を示し、それ以外の場合は戻り値は終了状態です。 C99は戻り値型main
を持つ関数も受け入れますが、お勧めしません。ここでfromを返すことは、戻り値の型を使用してmainから0を返すのと同じ意味を持ちます。void
main
int
- プログラムは、
exit
次のいずれかの関数を返すか、exit
C11 の_exit
新しい関数を返します。quick_exit
これらの関数のどれも返されず、どちらもプログラムを終了する効果がありますが、実際に実行する操作は異なります(たとえば、Quick_exitはバッファをフラッシュしますがHonorsatexit
呼び出しを実行しません)。 - たとえば、プログラムが許可されていない操作を実行したため、オペレーティングシステムは何らかの方法でプログラムを終了します。
答え2
exit(0)
(またはおそらくより理想的にはexit(EXIT_SUCCESS)
)すべてがうまくいったことを明確にするために使用できます。つまり、コードを読者に予想される内容のヒントを提供し、後続のコードに到達するのを防ぎます(未到達コードに対してコンパイラ警告を有効にすることができます)。子が_exit
完了したことを示す呼び出しも必要です。それ以外の場合、コードはエラー/子/親条件ブロックの後ろにあるすべての項目に属します。
それ以外の場合は、プロセスが正常に終了するか(exit
、return
in main
、または経由で)呼び出されるか、プログラムを終了する信号(または他の場所を介して)を_exit
食べることによって異常終了する可能性があります。abort
raise