13

SIGCHLD適切に処理する必要があります。既存のコードでどのように使用できますか? 0の代わりに使用しない限り、現時点では子プロセスを待つことができませんWNOHANG|WUNTRACED

status = 0; 
pid_t child, endID;

if(amp == 1)
        signal( SIGCHLD, SIG_IGN ); 

child = fork(); 

if (child  <  0) {    
        perror("fork() error\n");
        exit(EXIT_FAILURE);

} else if (child == 0) { 
        // do sth here
        perror("error\n");

} else { 
        //sleep(1)

削除するsleepと、親が最初に実行されます..なぜですか?

4

1 に答える 1

30

これが始まりです(ただし、以下をお読みください):

static void
child_handler(int sig)
{
    pid_t pid;
    int status;

    /* EEEEXTEERMINAAATE! */
    while((pid = waitpid(-1, &status, WNOHANG)) > 0)
        ;
}

/* Establish handler. */
struct sigaction sa;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sa.sa_handler = child_handler;

sigaction(SIGCHLD, &sa, NULL);

もちろん、これはすべて無意味です。親が単純に を無視するSIGCHLDと、子供は黙って刈り取られ、ゾンビにはなりません。

TLPIの引用:

SIGCHLD の性質を明示的に SIG_IGN に設定すると、その後終了する子プロセスは、ゾンビに変換されるのではなく、システムからすぐに削除されます。

したがって、次のようなものがうまくいくはずです。

signal(SIGCHLD, SIG_IGN); /* Silently (and portably) reap children. */
于 2011-08-24T07:22:46.570 に答える