0

よくわかりません。おそらく、man や他の多くのソースに基づいて、次のように: OS がプロセスを強制終了したときにコードを返す wait(&status) を使用すると、子プロセスの終了ステータスまたは戻り値を取得できるようになるはずです。

これらの 2 つのコード スニペットにより、その子の終了値を確認し、それを出力できるはずです。子プロセス関数:

    int childFunction(char in[],char logPath[]){
        FILE *logFile= fopen( logPath, "a" );
        if(logFile==NULL)
        return 1;
        int c=system(in);
        fclose(logFile);
        return(c);
    }

そしてメイン:

        {...some unimportant code before this}
        result= fork();
        if(result==0){
            exit(childFunction(inLine,logPath));
        }
        else if(result>0){
            int status=0;;
            int c=(int)waitpid(-1,&status,0);
            printf("a:%d b:%d\n",status, WIFEXITED(status));
        else
            return -1;
        i=0;

待って、しばらく寝て、出て、戻って、manページを数回読んでみました。この機能についての私の理解に基本的な誤りがあるか、4 時間見てもわからなくなってしまいました。

解決する なんらかの理由で、私は絶対に理解していませんが、return(c)in childFunction をif(c!=)return(1);else return(0)それに変更すると機能します。理由はわかりません。

解決済み 2 さて、今私は理由を知っていると思います. リターン コールまたは待機のいずれかによって、ステータスが最上位 8 ビット (256) に減少するようです。どういう意味ですか?つまり、通常の int を送信すると、最初のビットが使用され、最後の 8 ビットは破棄されます。同時に、return (1)コンパイラを指定すると、int が short int に自動的に「短縮」されます。解決策は、短い数値を返すか、以前の「解決済み」コメントで行ったように実行することです。

4

1 に答える 1

5

問題は、子供が終了するのを待っていないことです

int c=(int)waitpid(-1,&status,WNOHANG);

ここで、親プロセスは子プロセスが終了したかどうかを確認し、子プロセスが終了していない場合は戻ります。

上記の場合、子プロセスでファイルを開いているため、子プロセスで IO 待ちが発生し、親プロセスが実行される可能性が高くなります。

親プロセスはステータスをチェックし、WNOHANG使用されているため、waitpid でブロックされずに続行されます。これが正しいステータスを取得していない理由です。

使用することをお勧めします

int c=(int)waitpid(&status);
于 2013-03-26T17:30:48.733 に答える