【问题标题】:Why SIGALRM triggers semaphore?为什么 SIGALRM 触发信号量?
【发布时间】:2021-01-06 02:12:59
【问题描述】:

我是 linux 编程的新手。我做了以下实验,发现了一个奇怪的现象:我在程序中设置了一个定时器,当它超时时,它会触发信号量,但是我没有使用timer_handler中的“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。 暂停... 现在计数是:2。 暂停... 现在计数是:3。 暂停... 现在计数是:4。 暂停... 现在计数是:5。

【问题讨论】:

  • 我不明白您所说的“触发信号量”是什么意思。看起来正在发生的只是sem_wait 正在返回。检查返回值。

标签: linux signals semaphore


【解决方案1】:

为什么 SIGALRM 会触发信号量?

这是预期的行为。来自sem_wait manual

调用块 直到有可能执行递减(即, 信号量值高于零),或信号处理程序 打断电话。

许多系统调用都可以被信号中断。通过使用SA_RESTART 建立信号处理程序,可以自动重新启动包括sem_wait 在内的一些系统调用。阅读signal manual 了解更多详情。摘录如下:

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

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

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

  • 调用失败并出现错误 EINTR。

    这两种行为中的哪一种取决于接口和 是否使用 SA_RESTART 标志(参见 sigaction(2))。细节因 UNIX 而异 系统;下面是 Linux 的详细信息。

【讨论】:

  • 非常感谢您的解释。
猜你喜欢
  • 2017-03-16
  • 2011-02-27
  • 1970-01-01
  • 2018-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-04
相关资源
最近更新 更多