我的目标是制作一个每秒钟响起的闹钟,以便当它由sigaction处理时打印时间,因此每秒打印新时间。我在这段代码的中间有一个循环计数到一个随机数,但我把它拿出来使这段代码更加浓缩,更容易看,因为我相信问题是我如何使用sigaction,因为它打印多个一秒钟的时间,但我只需要一行输出。
#include <stdio.h>
#include <signal.h>
#include <time.h>
#include <unistd.h>
#include <stdlib.h>
void alarmPrint(int signum);
time_t curtime;
int main(){
printf("Enter ^C to end the program:\n");
struct sigaction sig;
sig.sa_handler = alarmPrint;
int count;
int final;
time(&curtime);
srandom(curtime);
while(1){
time(&curtime);
alarm(1);
printf("\n");
if(sigaction(SIGALRM, &sig, 0) == -1){
printf("Error\n");
}
}
return 0;
}
void alarmPrint(int signum){
printf("current time is %s\n", ctime(&curtime));
}
答案 0 :(得分:1)
正如其他人所指出的那样。
你应该将你的sigaction移动到循环之外以及警报。
#include <stdio.h>
#include <signal.h>
#include <time.h>
#include <unistd.h>
#include <stdlib.h>
void alarmPrint(int signum);
int main(){
int count;
int final;
printf("Enter ^C to end the program:\n");
signal(SIGALRM, alarmPrint);
alarm(1);
while(1) {
/* do other stuff here */
}
return 0;
}
void alarmPrint(int signum){
time_t curtime;
time(&curtime);
printf("current time is %s", ctime(&curtime));
alarm(1);
}
您还需要重置alarmPrint()
功能内的闹钟,以便它在一秒钟内响起。
最后ctime()
已经包含一个新行,所以在打印时间时你不需要一行。