2

アプリケーションがを実行し、子が(に失敗したために)でfork()死亡した場合、親プロセスは?を受け取りますか?abort()assert()SIGCHLD

関連する場合、これはDebian 4(gccバージョン4.1.2)にあります。

4

2 に答える 2

4

同じことを確認したい場合は、子を fork し、子が abort() を呼び出すサンプル コードを記述します (sigabrt シグナルを発生させるため)。strace で出力を確認します。(strace 実行可能ファイル)

次のコードの場合:

 #include<stdio.h>
 #include<unistd.h>
 int main()
    {
    pid_t pid;
    if(pid=fork()<0)
            {
            fprintf(stderr,"Error in forking");
            }
    else if(pid==0)
            {
            /*The child*/
            abort();
            }
    else {
            waitpid(pid,(int *)0,0);
            }
    return 0;
    }

私はこの出力を得ます:

     --- SIGCHLD (Child exited) @ 0 (0) ---
     gettid()                                = 4226
     tgkill(4226, 4226, SIGABRT)             = 0
     --- SIGABRT (Aborted) @ 0 (0) ---
     +++ killed by SIGABRT +++

したがって、少なくともUbuntuディストリビューションでは、答えはイエスです。

于 2011-11-22T12:50:15.600 に答える
1

子が親から離れていない限り、子が終了するたびに親がSIGCHLDを取得することを期待します(setsid()またはsetpgrp()を使用するIIRC)。子がこれを行う主な理由は、子がデーモンプロセスを開始している場合です。デーモンプロセスの詳細については、HereまたはHereを参照してください。

于 2010-10-01T09:21:16.897 に答える