Enviando sinal SIGINT para processar durante a execução da chamada do sistema ou script por killall -SIGINT [closed]

1

Eu quero enviar o SIGINT para todos os processos pelo nome, então estou usando o killall -SIGINT que estava funcionando bem. Agora eu introduzi system () chamada no meu código c para executar um script de shell ou shell que leva cerca de 10 segundos para ser concluído. Eu vejo que neste caso o manipulador de sinal não é chamado quando eu envio sinal.

Quando eu removo ou executo em segundo plano, esse sistema o chama novamente e começa a funcionar.

Por favor, qualquer um pode sugerir que eu o gerencie.

    
por Awadhesh Maurya 27.12.2016 / 07:43

2 respostas

3

da página man do sistema (3) -

system()  executes a command specified in command by calling /bin/sh -c command, and returns after the command has been completed.  During execution of the
       command, SIGCHLD will be blocked, and SIGINT and SIGQUIT will be ignored.

Mesmo que o sinal seja enviado para todos os processos (especificados por nome), o pai aqui ignora o SIGINT durante a chamada system (). No entanto, ele deve responder quando a chamada estiver concluída (durante o sono () no seu caso) - você tentou aumentar a janela do sono?

    
por 27.12.2016 / 13:08
0
#include<stdio.h>
#include <signal.h>
 void signalHandler(int);
int main()
{
    struct sigaction sa;
    sa.sa_flags = 0;
    // Setup the signal handler
    sa.sa_handler = signalHandler;
    // Block every signal during the handler
    sigfillset(&sa.sa_mask);  
    if (sigaction(SIGINT, &sa, NULL) == -1) {
    printf("Error: cannot handle SIGINT\n"); 
}

    while(1)
    {
        printf("Start to ping google.com");
        system("ping www.google.com -c 1");
        printf("Stop to ping google.com\n");
        sleep(1);
    }

}

void signalHandler(int signal)
{
    printf("signalHandler: signal = %d\n", signal); 
}
    
por 27.12.2016 / 12:14