首页 > 解决方案 > 如果发送太快则忽略信号

问题描述

我有以下代码:

//includes...

#define SIG_INT 0

//prints out <Text> when SIG_INT is received from siginfo_t*
void handler(int, siginfo_t*, void*);

int main()
{
    pid_t ambulance1 = 0;
    pid_t ambulance2 = 0;

    struct sigaction sigact;
    sigact.sa_sigaction = handler;
    sigemptyset(&sigact.sa_mask);
    sigact.sa_flags = SA_SIGINFO;
    sigaction(SIGUSR1, &sigact, NULL);

    ambulance1 = fork();
    if(ambulance1 > 0) {
        ambulance2 = fork();
        if(ambulance2 > 0) { // parent
            int status;
            waitpid(ambulance1, &status, 0);
            waitpid(ambulance2, &status, 0);

            printf("HQ went home!\n");
        }
    }

    if(ambulance1 == 0 || ambulance2 == 0) {
        union sigval signalValueInt;
        signalValueInt.sival_int = SIG_INT;

        sigqueue(getppid(), SIGUSR1, signalValueInt);

        printf("Ambulance[%d] ended.\n", getpid());
    }

    return 0;
}

会发生什么:有时第二辆救护车的 sigqueue(getppid(), SIGUSR1, signalValueInt); 没有收到,输出类似于以下内容:

  1. 救护车[20050]结束。// main() 打印出这个
  2. 救护车[20051]结束。// main() 打印出这个
  3. // handler() 只用 write() 打印一次!
  4. 总部回家了!// main() 打印出这个

我知道信号丢失了,因为两个信号一个接一个的来得太快了,而且操作系统。认为这是一个错误重复,所以它被忽略了。

我的问题是:

有没有办法告诉操作系统不要这样做?

我不想为同一目的使用两个不同的信号(例如:SIGUSR1 和 SIGUSR2),我也不想在其中一个子进程中使用延迟。

标签: csignalssigactionsigqueue

解决方案


答案在 signal(7) 的手册页中。但是简而言之:如果在处理程序运行时标准信号到达(如 SIGUSR1),它将被操作系统忽略。如果在处理程序运行时实时信号到达(如 SIGRTMIN),它将在处理程序完成运行后处理。


推荐阅读