POSIX TIMER-有多个计时器

问题描述

| 我试图在我的系统中有两个用于两个不同目的的计时器,但是我不明白为什么它不起作用。有人可以帮我吗?处理程序代码应该是最少的代码,这样任务本身就不会干扰滴答声吗?还可以定义单独的处理程序吗?
#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,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,NULL);
    tid2=SetTimer(SIG,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,&itval,&oitval) != 0) {
            perror(\"time_settime error!\");
        }
    }
    else {
        perror(\"timer_create error!\");
        return NULL;
    }
    return tid;
}
    

解决方法

当您用此ѭ1定义第二个计时器时,您的代码将此计时器配置为单次计时器
    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
您可以为计时器使用不同的处理程序,因为您正在使用不同的信号来捕获它们的到期时间。