sigaction捕获SIGALRM

时间:2014-11-03 21:32:47

标签: c

我的目标是制作一个每秒钟响起的闹钟,以便当它由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));

}

1 个答案:

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