Por que a função de sinal não pode chamar meu manipulador de sinal? [fechadas]

0

Aqui escrevi uma função de manipulador de sinal chamada handler Correspondentemente, este manipulador é registrado no kernel usando a função signal que será invocada quando SIGCHLD signal for gerado pelo meu processo filho. Aqui está o meu código

#include<stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
void handler(int sig){
    pid_t pid;
    printf("The name of the PID=%d\n",getpid());
    pid=wait(NULL);
    printf("Pid %d exited \n",pid);
}
int main(){
    signal(SIGCHLD,handler)

    if(!fork()){
        printf("This is the child process %d\n",getpid());
        exit(1);
    }
    printf("Parent pid is %d\n",getpid());
    printf("The parent is waiting");
    return 0;

}

A saída é:

Parent pid is 4356
The parent is waitingThis is the child process 4357

minha pergunta é por que o manipulador não é chamado mesmo que eu tenha usado a função de sinal para regsiter minha função de manipulador.Isso acontece somente quando meu manipulador não está registrado.Por que ??

    
por Kalu 28.07.2015 / 11:45

1 resposta

1

Você diz "o pai está esperando", e é por alguns ciclos, mas você "retorna 0", fazendo com que ele saia. Se você quiser receber o SIGCHLD, você precisa garantir que seus pais não saiam antes que a criança faça o que é necessário.

A maneira mais fácil de fazer isso: insira uma linha antes do seu return 0 :

sleep(10);

que fará com que seus pais esperem até 10 segundos.

Você notará que seu pai não espera por 10 segundos. A razão pela qual é deixada como um exercício para o leitor (sugestão: leia a man page; -)

    
por 28.07.2015 / 11:58

Tags