Linux 为什么SIGALRM触发信号量?

Linux 为什么SIGALRM触发信号量?,linux,signals,semaphore,Linux,Signals,Semaphore,我是linux编程的新手。我做了以下实验,发现了一个奇怪的现象:我在程序中设置了一个计时器,当计时器超时时,它会触发信号量,但我没有在计时器处理程序中使用函数“sem_post”。有人能解释原因吗?如何在信号量中阻止SIGALRM?非常感谢。 以下是我的代码: #include <unistd.h> #include <semaphore.h> #include <signal.h> int count = 1; sem_t job_queue; void

我是linux编程的新手。我做了以下实验,发现了一个奇怪的现象:我在程序中设置了一个计时器,当计时器超时时,它会触发信号量,但我没有在计时器处理程序中使用函数“sem_post”。有人能解释原因吗?如何在信号量中阻止SIGALRM?非常感谢。 以下是我的代码:

#include <unistd.h>
#include <semaphore.h>
#include <signal.h>

int count = 1;
sem_t job_queue;

void timer_handler(int signum)
{
    printf("time out...\n");
}

void init_timer_signal_action()
{
    struct sigaction timer_act;
    timer_act.sa_handler = timer_handler;
    timer_act.sa_flags  = 0;

    sigemptyset(&timer_act.sa_mask);
    sigaction(SIGALRM, &timer_act, NULL);
}

void init_timer()
{
    struct itimerval value;
    value.it_value.tv_sec=5;
    value.it_value.tv_usec=0;
    value.it_interval=value.it_value;
    setitimer(ITIMER_REAL,&value,NULL);
}

int main(void)
{
    init_timer_signal_action();
    init_timer();

    sem_init(&job_queue, 0, 0);

    while(1)
    {
        sem_wait(&job_queue);
        printf("Now count is: %d.\n", count++);
    }

    sem_destroy(&job_queue_count);
    return 0;
}
#包括
#包括
#包括
整数计数=1;
扫描作业队列;
无效计时器\u处理程序(整数符号)
{
printf(“超时…\n”);
}
无效初始化计时器信号动作()
{
结构sigaction计时器\u act;
timer_act.sa_handler=timer_handler;
timer_act.sa_标志=0;
SIGEPTYSET(和定时器动作模拟掩码);
SIGALRM和定时器动作,空;
}
void init_计时器()
{
结构itimerval值;
值。它的值。电视秒=5;
value.it\u value.tv\u usec=0;
value.it_interval=value.it_value;
setitimer(ITIMER_实值和值,NULL);
}
内部主(空)
{
初始化定时器信号动作();
初始化计时器();
sem_init(&作业队列,0,0);
而(1)
{
sem_等待(&job_队列);
printf(“现在计数为:%d.\n”,计数++);
}
sem_销毁(&job_queue_count);
返回0;
}
以下是运行该程序的结果: 时间到。。。 现在计数是:1。 时间到。。。 现在计数是:2。 时间到。。。 现在计数是:3。 时间到。。。 现在计数是:4。 时间到。。。 现在计数是:5

为什么SIGALRM触发信号量

这是预期的行为。从:

呼叫阻塞 直到可以执行减量(即。, 信号量值上升到零以上)或信号处理程序 打断电话

许多系统调用可被信号中断。通过使用
SA\u RESTART
建立信号处理程序,可以自动重新启动一些系统调用,包括
sem\u wait
。有关更多详细信息,请阅读。这里有一段摘录:

信号处理程序中断系统调用和库函数

如果在系统调用或库调用时调用信号处理程序 函数调用被阻止,则:

  • 调用在信号处理程序启动后自动重新启动 回报;或

  • 调用失败,错误为EINTR

    这两种行为中的哪一种发生取决于接口和 是否使用 SA_重启标志(见SIGATION(2))。各个UNIX系统的详细信息各不相同 系统;下面是Linux的详细信息


我不明白你说的“触发信号量”是什么意思。看起来所发生的一切都是
sem\u wait
正在返回。检查返回值。非常感谢您的解释。