2014-11-03 136 views
1

我的目标是制作一个每秒关闭的警报,以便在通过sigaction处理它时打印时间,因此每秒都会打印新时间。我在这段代码的中间有一个循环,它计数到一个随机数,但是我把它用来使这段代码更加简洁并且更容易看,因为我相信问题在于我如何使用sigaction,因为它会打印多个时间一秒钟,但我只需要在这一秒输出一行。sigaction捕捉SIGALRM

#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)); 

} 
+2

那么问题是什么? – 2014-11-03 21:39:12

+0

注意这个错字'time_t cur time;'应该是time_t curtime; – 2014-11-03 21:41:06

+0

这是如何正确使用sigaction捕捉SIGALRM信号时,我的理解是说alarm(1)意味着SIGALRM将在1秒内发送,sigaction将捕获然后调用alarmPrint然后打印当前时间,因此此程序运行时间的每一秒都将被打印。然而,目前它每秒打印一次以上,这是我的问题出现的地方,sigaction和alarm是否正确地用于所需的输出? – Konnor 2014-11-03 21:42:53

回答

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()已包含一个新行,所以打印时间时不需要一行。