comportamento do sinal de interrupção após a bifurcação

1

Eu usei o seguinte código enquanto estudava os sinais.

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

int handler(int sig)
{
    printf("interrupt has been invoked\n");
}

int main(){
    pid_t pid;//pid_t is the datatype for process ids
    int status;

    signal(SIGINT,handler);
    if((pid=fork())==0)
    {
        while(1)
            sleep(1);
        exit(0);
    }
    else
    {
        wait(NULL);
    }
}

e a saída recebida usando ctrl + c foi esta:

^Cinterrupt has been invoked
interrupt has been invoked
^Cinterrupt has been invoked
interrupt has been invoked
^Cinterrupt has been invoked
interrupt has been invoked

Alguém por favor pode explicar porque a "interrupção foi invocada" está sendo impressa duas vezes toda vez que ctrl + c é usado?

    
por dhruv gupta 14.06.2018 / 14:15

1 resposta

1

Isso ocorre porque o manipulador de sinal é válido para pai e filho após a chamada fork ().

Como o filho bifurcado é executado no mesmo grupo de processos que o pai, ambos os processos recebem o sinal.

Você pode gostar de usar este comando printf ():

printf("interrupt has been invoked in pid %d\n", (int)getpid());

O driver tty tem um grupo de processo tty configurado e se você digitar ^ C e ^ C é configurado como o caractere TTY INTR, então o driver tty envia SIGINT para todos os processos que estão no mesmo grupo de processo que o tty motorista.

    
por 14.06.2018 / 14:38

Tags