当前位置: 首页 > 面试题库 >

计时器和信号出现问题

邬友樵
2023-03-14
问题内容

我已经使用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将显示。否则Stray signal将显示。



 类似资料:
  • 我目前正在用C设计一个计数信号量,试图遵守与Java相同的标准级别,除了InterupptedExceptions之外,因为C std::threads不支持中断。我正在阅读Java的类文档,这时遇到了两个让我困惑的问题。 https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/Semaphore.html 问题1: 关于许可证

  • 我首先想到的是:我认为有点非常准确,给出了一个值,其中as请求一个参数;上面写着什么?不要认为<代码>摆动定时器<代码>是准确的吗? 2) 假设用计时一个单词需要x毫秒;如果我们在重复一项任务(突出显示一个单词,如卡拉OK应用程序),我会包含以下代码: 安静地工作很好,但我肯定我不能依靠这一点,因为时间,长度可能会改变!如何克服这个问题?因为几毫秒内的变化可能会给我带来灾难性的后果。 3) 同时,

  • 在GATE计算信号量时会问到这些问题。 一般来说,问题非常简单,只包含减法和加法。 以下类型的问题可以在GATE中询问。 计数信号量初始化为12。然后在这个信号量上计算10P(等待)和4V(信号)操作。 结果是什么? 因此,计数信号量的最终值是。

  • 有一些情况需要同时在临界区执行多个进程。 但是,当我们需要同时在临界区中有多个进程时,可以使用计数信号量。 信号量实现的编程代码如下所示,其中包括信号量的结构以及在临界区中可以执行的入口和退出的逻辑。 在这种机制中,临界区的入口和退出是根据计数信号量的值执行的。在任何时间点计算信号量的值表示可以同时在临界区输入的最大进程数。 想要进入临界区的进程首先将信号量值减1,然后检查它是否为负值。如果它变为

  • 问题内容: 我正在尝试制作一个使用套接字编程和计时器来侦听客户端输入流的程序 但是每当计时器执行..它被挂起 请帮帮我 这是代码… 提前致谢 问题答案: 使程序成为多线程;一个线程在套接字上侦听,另一个线程处理GUI。使用SwingUtilities.invokeLater,只要网络线程接收到数据,就让GUI线程(“事件调度线程”)进行GUI更新。

  • 问题内容: 我需要在Flask应用程序上定期运行某些任务。我决定使用一个简单的库-Schedule(https://github.com/dbader/schedule)来执行此操作。我在与主应用程序线程不同的线程上运行任务计划程序。这是相关的代码片段。 运行此程序时,我想要“运行定期任务!” 每10秒打印一次。但是,这是我得到的输出。 显然,由于某种原因,任务似乎每10秒执行两次,而不是一次。但