C,timer_settime,撤防计时器和覆盖相关数据?

时间:2017-08-15 16:27:22

标签: c timer signals real-time handler

我必须为大学做一个关于UDP的项目,我必须保证可靠的沟通;对于数据包,我想使用timer_gettime()和timer_Settime()函数,因为我可以排队信号,我可以将它们与一个计时器相关联;特别是,struct sigevent有一个字段,它结合sigval,我可以在信号到达时将值传递给处理程序;我想利用这个传递来处理计时器到期的数据包数量;我有一个问题,我已经做了一个简单的程序来验证这一点;当我启动计时器时,我可以解除它将struct sigevent的it_value设置为0;但数据并没有改变;如果我发送100个信号,标题只接收第一个信号的数据。这是我的代码:

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


int d;


void err_exit(char* str)
{
    perror(str);
    exit(EXIT_FAILURE);
}


void sighandler(int sig, siginfo_t *si, void *uc)
{
    (void) sig;
    (void) uc;
    d = si->si_value.sival_int;
}



void handle_signal(struct sigaction* sa)
{
    sa->sa_flags = SA_SIGINFO;
    sa->sa_sigaction = sighandler;
    sigemptyset(&sa->sa_mask);
    if (sigaction(SIGRTMAX,sa,NULL) == -1)
        err_exit("sigaction");
}



void create_timer(struct sigevent* sev,timer_t* timer_id,int i)
{
    union sigval s;
    s.sival_int = i;
    printf("value: %d\n",i);
    sev->sigev_notify = SIGEV_SIGNAL;
    sev->sigev_signo = SIGRTMAX;
    sev->sigev_value = s;


    timer_create(CLOCK_REALTIME,sev,timer_id);

}


void set_timer(timer_t timer_id,struct itimerspec* ts)
{
    if(ts == NULL)
        printf("itimerspec null\n");
    if (timer_settime(timer_id, 0, ts, NULL) == -1){
        printf("errno code: %d\n",errno);
        err_exit("timer_settime");
    }
}



void initialize_timerspec(struct itimerspec* ts)
{
    ts->it_value.tv_sec = 2;
    ts->it_value.tv_nsec = 5;
    ts->it_interval.tv_sec = 0;
    ts->it_interval.tv_nsec = 0;
}



void reset_timer(timer_t timer_id, struct itimerspec* ts)
{
    ts->it_value.tv_sec = 0;
    ts->it_value.tv_nsec = 0;
    ts->it_interval.tv_sec = 0;
    ts->it_interval.tv_nsec = 0;
    if (timer_settime(timer_id, 0, ts, NULL) == -1){
            printf("errno code: %d\n",errno);
            err_exit("timer_settime");
    }
}





int main()
{
    struct sigaction sa;
    struct itimerspec ts[2];
    struct sigevent sev[2];
    timer_t timer_id[2];

    handle_signal(&sa);


    create_timer(sev,timer_id,0);
    initialize_timerspec(ts);
    set_timer(timer_id,ts);
    reset_timer(timer_id,ts);


    create_timer(sev + 1,timer_id + 1,1);
    initialize_timerspec(ts + 1);
    set_timer(timer_id,ts + 1);

    printf("id1: %ju    id2:  %ju\n",timer_id[0],timer_id[1]);
    sleep(10);

    printf("d = %d\n",d);

    exit(EXIT_SUCCESS);
}

我撤防第一个计时器,并发送另一个信号;但是处理程序接收与第一个信号关联的数据,因为它打印0.有没有办法发送到覆盖数据,发送到第二个信号的处理程序数据(在这种情况下为1)?

0 个答案:

没有答案