3

sigchld の使用に問題があります...

私がやりたいのは、フォークで子プロセスを作成し、子プロセスを印刷して数回スリープさせることです...これらのプロセス中に、子プロセスにシグナルを送信し(SIGSTOPおよびSIGCONTINUED)、親が必要です信号が何であったかを出力するには...ここに私のコードがあります:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
void handler (int i) {
    int x;
    waitpid(-1,&x, 0);
    printf("WIFSTOPPED=%d, WIFCONTINUED=%d\n", WIFSTOPPED(x),WIFCONTINUED(x) );
}

int main(){

    int x;
    int q=fork();
    if(q==0){
        int i=0;
        printf("%d\n",getpid());
        while (i<20){
            printf("%d\n", i++);
            sleep(1);
        }
        _exit(0);
    }
    else {
        signal(SIGCHLD, handler);
        waitpid(-1,&x, 0);
        while(WIFEXITED(x)!=1){
            waitpid(-1,&x, 0);
            sleep(1);
        }
        exit(0);
    }
}

しかし、SIGSTOPまたはSIGCONTINUEDを子に送信すると、子は停止して続行しますが、親は何も出力しないため、機能しません

なにか提案を?

4

1 に答える 1

1

あなたのハンドラーはwaitpid再び呼び出すことはできず、メインの while ループも正しくありません。もう一度waitpid、最初に 2 回呼び出します。そして最後に、あなたのwaitpid呼び出しは、ステータスの変更に関心があることを宣言します (WUNTRACEDオプション)。

より正しいコードは次のようになります。

void handler (int i) { // a handler just handle the fact some signal occured
    printf("in handler\n");
}

int main(){
    int x;
    int q=fork();
    if(q==0){
        int i=0;
        printf("%d\n",getpid());
        while (i<20){
            printf("%d\n", i++);
            sleep(1);
        }
        _exit(0);
    }
    else {
        signal(SIGCHLD, handler); // catch child status changes
        do {
            waitpid(-1,&x, WUNTRACED|WCONTINUED); // wait until child terminates or changes its status
            if (WIFSTOPPED(x)|WIFCONTINUED(x)) // test what really happens
                printf("STOPPED=%d, CONTINUED=%d\n", WIFSTOPPED(x),WIFCONTINUED(x) );
        } while(!WIFEXITED(x));
        exit(0);
    }
}
于 2014-12-07T11:44:20.177 に答える