我想按名称将 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);
}