双信号发送命令超时

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 延迟内。事实上,我认为这是通过你的实验确定的,尽管我没有找到它的记录。