gpt4 book ai didi

c - 定时器和信号中的问题

转载 作者:IT王子 更新时间:2023-10-29 01:02:55 25 4
gpt4 key购买 nike

我已经使用 timer_create( ) API 实现了一个 POSIX 计时器,当计时器到期时这将生成 SIGUSR1,我已经为其放置了一个处理程序代码。现在的问题是,如果这个程序接收到另一个 SIGUSR1,那么将调用并捕获相同的信号处理程序。

有什么方法可以防止这种情况发生,以便处理程序可以捕获仅由计时器生成的信号?

最佳答案

这对你有用吗? (修改了 timer_create 手册页中示例的代码。)

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <time.h>

#define CLOCKID CLOCK_REALTIME
#define SIG SIGUSR1
timer_t timerid;


static void handler(int sig, siginfo_t *si, void *uc)
{
if(si->si_value.sival_ptr != &timerid){
printf("Stray signal\n");
} else {
printf("Caught signal %d from timer\n", sig);
}
}

int main(int argc, char *argv[])
{
struct sigevent sev;
struct itimerspec its;
long long freq_nanosecs;
sigset_t mask;
struct sigaction sa;

printf("Establishing handler for signal %d\n", SIG);
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = handler;
sigemptyset(&sa.sa_mask);
sigaction(SIG, &sa, NULL);

sev.sigev_notify = SIGEV_SIGNAL;
sev.sigev_signo = SIG;
sev.sigev_value.sival_ptr = &timerid;
timer_create(CLOCKID, &sev, &timerid);
/* Start the timer */

its.it_value.tv_sec = 10;
its.it_value.tv_nsec = 0;
its.it_interval.tv_sec = its.it_value.tv_sec;
its.it_interval.tv_nsec = its.it_value.tv_nsec;

timer_settime(timerid, 0, &its, NULL);
sleep(100);
exit(EXIT_SUCCESS);
}

当捕捉到来自定时器的信号时 Caught signal 10 from timer 将被显示。否则将显示杂散信号

关于c - 定时器和信号中的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5740954/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com