我想每秒触发一个计时器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;
}
答案 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, ¬imer, 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;
}
最后要注意的是,如果系统负载很高,则无法保证定时器每秒都会发送一次。