UNIXでは、プロセスはいつ終了しますか?

UNIXでは、プロセスはいつ終了しますか?

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つの状況のいずれかで終了します。

  1. プログラムはmain関数から返されます。戻り値が 0 の場合は成功を示し、それ以外の場合は戻り値は終了状態です。 C99は戻り値型mainを持つ関数も受け入れますが、お勧めしません。ここでfromを返すことは、戻り値の型を使用してmainから0を返すのと同じ意味を持ちます。voidmainint
  2. プログラムは、exit次のいずれかの関数を返すか、exitC11 の_exit新しい関数を返します。quick_exitこれらの関数のどれも返されず、どちらもプログラムを終了する効果がありますが、実際に実行する操作は異なります(たとえば、Quick_exitはバッファをフラッシュしますがHonorsatexit呼び出しを実行しません)。
  3. たとえば、プログラムが許可されていない操作を実行したため、オペレーティングシステムは何らかの方法でプログラムを終了します。

答え2

exit(0)(またはおそらくより理想的にはexit(EXIT_SUCCESS))すべてがうまくいったことを明確にするために使用できます。つまり、コードを読者に予想される内容のヒントを提供し、後続のコードに到達するのを防ぎます(未到達コードに対してコンパイラ警告を有効にすることができます)。子が_exit完了したことを示す呼び出しも必要です。それ以外の場合、コードはエラー/子/親条件ブロックの後ろにあるすべての項目に属します。

それ以外の場合は、プロセスが正常に終了するか(exitreturnin main、または経由で)呼び出されるか、プログラムを終了する信号(または他の場所を介して)を_exit食べることによって異常終了する可能性があります。abortraise

関連情報