运行计时器30秒

时间:2016-01-20 03:31:08

标签: c timer setitimer

我想每秒触发一个计时器30秒。但是,计时器仅触发一次,程序停止。如何让计时器运行30秒?

struct Node {
    int data;
    struct Node *next;
};

struct List {
    struct Node *head;   
};

void pushList(struct List *linkedList, int value) {
    if (linkedList->head == NULL) { 
        struct Node *newNode;
        newNode = malloc(sizeof(struct Node));
        newNode->data = value;
        linkedList->head = newNode;
    } else {
        struct Node *tNode = linkedList->head;
        while (tNode->next != NULL) {
            tNode = tNode->next;
        }
        struct Node *newNode;
        newNode = malloc(sizeof(struct Node));
        newNode->data = value;
        tNode->next = newNode;
    }
}

void printList(struct List *linkedList) {
    struct Node *tNode = linkedList->head;
    while (tNode != NULL) {
        printf("This node has a value of %d\n", tNode->data);
        tNode = tNode->next;
    }
}

int main() {
    struct List newList = { 0 }; //This initializes to null

    pushList(&newList, 200);
    pushList(&newList, 300);
    pushList(&newList, 400);
    pushList(&newList, 500);

    printList(&newList);
    return 0;
}

2 个答案:

答案 0 :(得分:0)

收到信号后,你的程序会被取消暂停,它只会到main()的末尾并返回。你需要再次暂停它,你想等待另一个信号。

答案 1 :(得分:0)

您遇到的一个问题是第一个计时器触发器结束pause调用并且您的程序终止。 pause命令的描述如下:

  

暂停函数暂停程序执行,直到信号到达,其动作是执行处理函数,或终止进程。

另一个问题是你错误地使用了“间隔”。如果它是重复计时器,则该值应该是计时器重置的数字。因此,要触发每一秒,您需要将其设置为1

现在,如果你想让它运行30秒,你需要维护一个计数器,然后在该计数器完成后重置计时器。最后,您需要保持重新暂停,直到有足够的中断服务为止。

试试这个:

#include <sys/time.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>

volatile int timer_remain = 30;

void alarmhandler()
{
    static struct itimerval notimer = { 0 };
    printf( "Timer triggered\n" );
    if( --timer_remain == 0 )
    {
        setitimer( ITIMER_REAL, &notimer, 0 );
    }
}

int main()
{
    struct itimerval timerval = { 0 };
    timerval.it_value.tv_sec = 1;
    timerval.it_interval.tv_sec = 1;

    signal( SIGALRM, alarmhandler );
    setitimer( ITIMER_REAL, &timerval, 0 );

    while( timer_remain > 0 )
    {
        pause();
    }

    printf( "Done\n" );
    return 0;
}

最后要注意的是,如果系统负载很高,则无法保证定时器每秒都会发送一次。