【发布时间】: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正在返回。检查返回值。