通过killall -SIGINT执行系统调用或脚本时向进程发送信号SIGINT

通过killall -SIGINT执行系统调用或脚本时向进程发送信号SIGINT

我想按名称将 SIGINT 发送到所有进程,因此我使用了killall -SIGINT,它工作得很好。现在,我在我的 C 代码中引入了 system() 调用来运行 shell 脚本或 shell 命令,这大约需要 10 秒才能完成。我发现在这种情况下,当我发送信号时,不会调用信号处理程序。

当我删除或在后台运行它时,系统调用它再次开始工作。

请任何人都可以建议我来管理它。

答案1

来自 system(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.

即使信号被发送到所有进程(由名称指定),这里的父进程也会在 system() 调用期间忽略 SIGINT。但是,一旦调用完成(在您的情况下在 sleep() 期间),它应该做出响应 - 您是否尝试过增加睡眠窗口?

答案2

#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); 
}

相关内容