LinuxForum.Fans
Тема

Загадка: Добро пожаловать в зомбиленд (fork, signal и wait)

Автор: inneska 5 сообщений 2461 просмотров
#41699

Будут ли появляться зомби в результате работы данной программы?

text

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
void chld_trap();
int main(){
        int i;
        signal(SIGCHLD,chld_trap);
        for (i=0; i<15 ; i++)
        if ( ! fork() ) {
                sleep(10);
                exit(i);
        }
        for (;;) pause;
return 0;
}
void chld_trap(){
        int status,pid;
        pid=wait(&status);
        fprintf(stderr, "Сын с PID=%d завершился с кодом %x \n",pid,status);
}

И главное почему?

Если будете запускать программу, запускайте её в фоновом режиме.
zombielabd &

#41806

появляются :)

#41826

Почему?
И что надо исправить, что бы не появлялись?

#41922
text

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

void chld_trap();

int main(){ int i; signal(SIGCHLD,chld_trap); for (i=0; i<15 ; i++) if ( ! fork() ) { sleep(10); exit(i); } for (;;) pause; return 0; } void chld_trap(){ int status,pid; while((pid = waitpid(-1, &status, WNOHANG)) > 0) { fprintf(stderr, "Сын с PID=%d завершился с кодом %x \n",pid,status); } }

wait() убирает только одного зомби, а на момент получения сигнала CHLD их может несколько.

#42189
admin написал:
wait() убирает только одного зомби, а на момент получения сигнала CHLD их может несколько.

угу. так и получилось в моём эксперименте... думать мне было лень :)

Войдите или зарегистрируйтесь, чтобы ответить.