双信号发送命令超时
Double signal send with command timeout
我目前正在从事一个需要管理信号的项目。
我目前正在使用此代码
#include <stdio.h>
#include <signal.h>
void gest_sig_int(int signo) {
write(1, "I receive a signal\n", 19);
}
int main(void) {
struct sigaction s;
s.sa_handler = gest_sig_int;
s.sa_flags = 0;
sigemptyset(&s.sa_mask);
sigaction(SIGINT , &s, NULL);
while (1);
return (0);
}
我用
编译
gcc test.c -o test
如果我执行代码并使用CTRL + C程序显示
./test
^CI receive a signal
这正是我想要的结果!
但是当我尝试用 timeout 命令做同样的事情时,我的程序接收到两次信号
timeout -s INT 2 ./test
I receive a signal
I receive a signal
不知道是我的程序还是命令timeout
感谢阅读!
But when I am trying to do the same thing with the timeout command my
programme receive the signal twice
我可以使用 GNU coreutils 8.25 中包含的 timeout
命令重现您的问题。
I don't know if it's come from my programme or the command timeout
我看不出有任何理由认为这是您的程序,如果我对 timeout
命令使用不同的变体,我可以观察到不同的行为:
> timeout -k 1 -s INT 2 ./test
I receive a signal
Killed
>
-k 1
指示 timeout
向 child 发送 SIGKILL,如果它在收到第一个信号后的一秒内没有终止。有了这个,测试程序的信号处理程序(只为 SIGINT
注册)只触发一次,无论为终止超时指定了多长时间的延迟。
当未指定 -k
选项时,观察到此版本 timeout
的行为似乎是在 child 未终止时发送相同类型的第二个信号在第一个信号后的 sub-second 延迟内。事实上,我认为这是通过你的实验确定的,尽管我没有找到它的记录。
我目前正在从事一个需要管理信号的项目。 我目前正在使用此代码
#include <stdio.h>
#include <signal.h>
void gest_sig_int(int signo) {
write(1, "I receive a signal\n", 19);
}
int main(void) {
struct sigaction s;
s.sa_handler = gest_sig_int;
s.sa_flags = 0;
sigemptyset(&s.sa_mask);
sigaction(SIGINT , &s, NULL);
while (1);
return (0);
}
我用
编译gcc test.c -o test
如果我执行代码并使用CTRL + C程序显示
./test
^CI receive a signal
这正是我想要的结果!
但是当我尝试用 timeout 命令做同样的事情时,我的程序接收到两次信号
timeout -s INT 2 ./test
I receive a signal
I receive a signal
不知道是我的程序还是命令timeout
感谢阅读!
But when I am trying to do the same thing with the timeout command my programme receive the signal twice
我可以使用 GNU coreutils 8.25 中包含的 timeout
命令重现您的问题。
I don't know if it's come from my programme or the command timeout
我看不出有任何理由认为这是您的程序,如果我对 timeout
命令使用不同的变体,我可以观察到不同的行为:
> timeout -k 1 -s INT 2 ./test
I receive a signal
Killed
>
-k 1
指示 timeout
向 child 发送 SIGKILL,如果它在收到第一个信号后的一秒内没有终止。有了这个,测试程序的信号处理程序(只为 SIGINT
注册)只触发一次,无论为终止超时指定了多长时间的延迟。
当未指定 -k
选项时,观察到此版本 timeout
的行为似乎是在 child 未终止时发送相同类型的第二个信号在第一个信号后的 sub-second 延迟内。事实上,我认为这是通过你的实验确定的,尽管我没有找到它的记录。