POSIX TIMER - 有多个计时器

2024-01-09

我试图在我的系统中有两个计时器用于两个不同的目的,但我不明白为什么它不起作用。有人可以帮助我吗?另外,处理程序代码是否应该是最低限度的,以便任务本身不会干扰滴答声?我还可以定义单独的处理程序吗?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <netinet/in.h>
#include <linux/socket.h>
#include <time.h>


#define SIGTIMER (SIGRTMAX)
#define SIG SIGUSR1
static timer_t     tid;
static timer_t     tid2;

void SignalHandler(int, siginfo_t*, void* );
timer_t SetTimer(int, int, int);

int main(int argc, char *argv[]) {


    struct sigaction sigact;
    sigemptyset(&sigact.sa_mask);
    sigact.sa_flags = SA_SIGINFO;
    sigact.sa_sigaction = SignalHandler;
    // set up sigaction to catch signal
    if (sigaction(SIGTIMER, &sigact, NULL) == -1) {
        perror("sigaction failed");
        exit( EXIT_FAILURE );
    }

    // Establish a handler to catch CTRL+c and use it for exiting.
    sigaction(SIGINT, &sigact, NULL);
    tid=SetTimer(SIGTIMER, 1000, 1);

    struct sigaction sa;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = SA_SIGINFO;
    sa.sa_sigaction = SignalHandler;
    // set up sigaction to catch signal
    if (sigaction(SIG, &sa, NULL) == -1) {
        perror("sa failed");
        exit( EXIT_FAILURE );
    }

    // Establish a handler to catch CTRL+c and use it for exiting.
    sigaction(SIGINT, &sa, NULL);
    tid2=SetTimer(SIG, 1000, 3);
    for(;;);
    return 0;
}

void SignalHandler(int signo, siginfo_t* info, void* context)
{
    if (signo == SIGTIMER) {
        printf("Command Caller has ticked\n");

    }else if (signo == SIG) {
        printf("Data Caller has ticked\n");

    } else if (signo == SIGINT) {
        timer_delete(tid);
        perror("Crtl+c cached!");
        exit(1);  // exit if CRTL/C is issued
    }
}
timer_t SetTimer(int signo, int sec, int mode)
{
    static struct sigevent sigev;
    static timer_t tid;
    static struct itimerspec itval;
    static struct itimerspec oitval;

    // Create the POSIX timer to generate signo
    sigev.sigev_notify = SIGEV_SIGNAL;
    sigev.sigev_signo = signo;
    sigev.sigev_value.sival_ptr = &tid;

    if (timer_create(CLOCK_REALTIME, &sigev, &tid) == 0) {
        itval.it_value.tv_sec = sec / 1000;
        itval.it_value.tv_nsec = (long)(sec % 1000) * (1000000L);

        if (mode == 1) {
            itval.it_interval.tv_sec = itval.it_value.tv_sec;
            itval.it_interval.tv_nsec = itval.it_value.tv_nsec;
        }
        else {
            itval.it_interval.tv_sec = 0;
            itval.it_interval.tv_nsec = 0;
        }

        if (timer_settime(tid, 0, &itval, &oitval) != 0) {
            perror("time_settime error!");
        }
    }
    else {
        perror("timer_create error!");
        return NULL;
    }
    return tid;
}

当你用这个定义你的第二个计时器时tid2=SetTimer(SIG, 1000, 3);,您的代码将此计时器配置为一次性计时器

    if (mode == 1) {
        itval.it_interval.tv_sec = itval.it_value.tv_sec;       // here you arm the timer periodically (that's the meaning of it_interval
        itval.it_interval.tv_nsec = itval.it_value.tv_nsec;
    }
    else {
        itval.it_interval.tv_sec = 0;     // here you arm the timer once
        itval.it_interval.tv_nsec = 0;
    }

如果您将第二个计时器配置为 mode=1,如下所示tid2=SetTimer(SIG, 1000, 4);,您将在控制台上获得此信息:

Command Caller has ticked
Data Caller has ticked
Command Caller has ticked
Data Caller has ticked
Command Caller has ticked
Data Caller has ticked
^CCrtl+c cached!: Success

您可以为计时器使用不同的处理程序,因为您使用不同的信号来捕获它们的到期时间。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

POSIX TIMER - 有多个计时器 的相关文章

随机推荐

  • 如何在java客户端中获取HDFS服务器元数据信息?

    我需要构建一个实用程序类来测试与 HDFS 的连接 测试应显示 HDFS 的服务器端版本和任何其他元数据 虽然有很多可用的客户端演示 但没有关于提取服务器元数据的内容 有人可以帮忙吗 请注意 我的客户端是远程 java 客户端 没有 had
  • 如何在 macOS 上以编程方式将文件和文件夹移至垃圾箱?

    我在这个主题上所能找到的只是提到FSMoveObjectToTrashSync函数 现在是已弃用并且没有列出替代方案 https developer apple com documentation coreservices 1566651
  • java xml 删除项目

    我有一个非常简单的 xml 文件 我想创建一个简单的函数来从中删除项目 这是我的 xml 文件
  • 为什么我们需要将压缩对象转换为列表

    我正在尝试完成一个数据营练习 其中我需要将 2 个列表转换为zip object然后进入一个dict最终得到一个dataframe使用熊猫 但是 如果我使用zip 对列表进行函数并将它们转换为字典 然后转换为数据框 我没有得到任何错误 但简
  • 如何检查 bash 脚本中是否以 root 身份运行

    我正在编写一个需要 root 级别权限的脚本 并且我想这样做 以便如果该脚本不以 root 身份运行 它只是回显 请以 root 身份运行 并退出 这是我正在寻找的一些伪代码 if whoami root then echo Please
  • 如何使用 Excel 在 Outlook 365 Exchange 中引用组或共享日历?

    我正在尝试让多个用户能够使用 Excel 将约会添加到共享日历 以下代码对我有用 我拥有共享日历 它位于 Outlook365 中的我的日历文件夹中 Sub CreateAppt Const olFolderCalendar 9 Const
  • 如何在 Dart 中创建一个空白的 Future + 如何返回当前正在进行的 Future?

    我正在尝试创建一个服务器端 Dart 类来执行各种与数据相关的任务 所有这些任务都依赖于首先初始化的数据库 问题是数据库的初始化是异步发生的 返回 Future 我首先尝试将初始化代码放入构造函数中 但放弃了这种方法 因为它似乎不可行 我现
  • 如何通过java代码在属性文件中写入值

    我有一个问题 我有一个属性文件 我想在该文件中存储一些值 并在需要时在代码中实现 有什么办法可以做到这一点吗 我在用Properties类来做到这一点 使用加载属性文件java util Properties http docs oracl
  • 为什么我无法将 firebase 电子邮件密码登录链接到 google 登录?

    我已经成功实施了Firebase Google 登录 https firebase google com docs auth android google signin在我的 Android 应用程序中 它工作正常 但是 我希望用户也使用电
  • 获取与 SIM 卡关联的电话号码

    如何获取与 CMDA 和 GSM 的 SIM 卡关联的电话号码以及服务提供商名称 Android TelephonyManager 可能不会在所有情况下都返回号码 如果运营商未设置号码 它可能不会返回号码 您必须创建一个验证场景 要求用户输
  • 如何向 Spark RDD 添加新列?

    我有一个 RDDMANY列 例如 hundreds 如何在此 RDD 的末尾添加一列 例如 如果我的 RDD 如下所示 123 523 534 893 536 98 1623 98472 537 89 83640 9265 7297 983
  • 更新(重新部署)现有的 azure webjob

    我创建了一个按需网络作业 在管理门户中 没有上传新 zip 或更新它的选项 我可以删除现有的网络作业并创建一个新的网络作业 但我想保留我的日志 有没有办法重新部署它 覆盖旧版本 维护日志 您可以通过 FTP 连接到 Webjob 所在的网站
  • 为什么 data-* 属性比普通 ID 属性更适合用于元素选择?

    Cypress https docs cypress io guides references best practices html Selecting Elements和许多其他关于测试 Web 应用程序的帖子建议依赖像这样的数据属性d
  • 原深感摄像头的拍摄范围是多少?

    前置原深感摄像头可以检测到的最小和最大距离是多少 When 检测深度数据 https developer apple com documentation avfoundation cameras and media capture stre
  • WPF - 延迟多重绑定

    我有一个多重绑定 看起来像这样
  • 如何在 Postgres 中获取时间间隔的平均值

    我正在使用 PostgreSQL 9 6 我有一个这样的表 mac sn loc time date vin1 vin2 vin3 1a34 4as11111111 aaaa 7 06 18 1 1 2018 447 42 472 32 6
  • 如何从 xcode 获取自己的应用程序版本?

    我想知道是否有办法在将其放入 xCode 中的 Summary 选项卡后 在代码中获取自己的应用程序版本 一种方法似乎是搜索Info plist for CFBundleVersion关键 但是还有其他更简单 更方便的方法吗 您可以在主包中
  • VB.NET LINQ 按多列分组

    我有以下 LINQ 代码 该代码有语法错误 但我不知道如何修复它 Dim query From row In mainDatatable AsEnumerable the syntax Error is in the following l
  • 保持当前页面呈现,直到加载下一页

    我有一个基于 WebView loadUrl http www example com http www example com 当用户单击 URL 时 默认行为是立即显示空白页面 等待页面加载 然后显示此页面 我设法显示启动屏幕来代替空白
  • POSIX TIMER - 有多个计时器

    我试图在我的系统中有两个计时器用于两个不同的目的 但我不明白为什么它不起作用 有人可以帮助我吗 另外 处理程序代码是否应该是最低限度的 以便任务本身不会干扰滴答声 我还可以定义单独的处理程序吗 include