3

任何人都可以通过一些程序示例来说明在gnu C中使用settimer或alarm函数吗?

我有一个程序可以连续处理一些数据,我需要设置一个每隔 t 秒响一次的计时器/警报,作为响应,我需要将处理后的数据存储到文件中。该文件写入必须是异步的<即数据处理和文件写入不能相互等待>。我浏览了 GNU C 库页面,但我不太了解..

[编辑]

我得到了这个程序:

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

#define INTERVAL 1

int howmany = 0;

void alarm_wakeup (int i)
{
   struct itimerval tout_val;

   signal(SIGALRM,alarm_wakeup);

   howmany += INTERVAL;

   printf("\n%d sec up partner, Wakeup!!!\n",howmany);
   tout_val.it_interval.tv_sec = 0;
   tout_val.it_interval.tv_usec = 0;
   tout_val.it_value.tv_sec = INTERVAL; /* 10 seconds timer */
   tout_val.it_value.tv_usec = 0;

   setitimer(ITIMER_REAL, &tout_val,0);

}

void exit_func (int i)
{
    signal(SIGINT,exit_func);
    printf("\nBye Bye!!!\n");
    exit(0);
}

int main ()
{
  struct itimerval tout_val;

  tout_val.it_interval.tv_sec = 0;
  tout_val.it_interval.tv_usec = 0;
  tout_val.it_value.tv_sec = INTERVAL; /* 10 seconds timer */
  tout_val.it_value.tv_usec = 0;
  setitimer(ITIMER_REAL, &tout_val,0);

  signal(SIGALRM,alarm_wakeup); /* set the Alarm signal capture */
  signal(SIGINT,exit_func);

  while (1)
  {
    //printf("!");
  }

  return 0;

}

但似乎我在计时器开启时​​无能为力。我应该修改什么以满足我的需要?请建议.. [/编辑]

4

1 回答 1

9

这是here中用于setitimer()定期调用的示例DoStuff()

这里的关键是,调用setitimer()会导致操作系统安排SIGALRM在指定时间过去后将 a 发送到您的进程,并且由您的程序在该信号到来时处理该信号。您可以通过为信号类型(在这种情况下)注册一个信号处理函数来处理信号DoStufF(),之后操作系统将知道在计时器到期时调用该函数。

您可以阅读setitimer() 手册页以了解参数是什么以及如何取消计时器。

注意:如果您希望计时器只触发一次,则必须调用alarm()orualarm()而不是setitimer().

/*
 * setitimer.c - simple use of the interval timer
 */

#include <sys/time.h>       /* for setitimer */
#include <unistd.h>     /* for pause */
#include <signal.h>     /* for signal */

#define INTERVAL 500        /* number of milliseconds to go off */

/* function prototype */
void DoStuff(void);

int main(int argc, char *argv[]) {

  struct itimerval it_val;  /* for setting itimer */

  /* Upon SIGALRM, call DoStuff().
   * Set interval timer.  We want frequency in ms, 
   * but the setitimer call needs seconds and useconds. */
  if (signal(SIGALRM, (void (*)(int)) DoStuff) == SIG_ERR) {
    perror("Unable to catch SIGALRM");
    exit(1);
  }
  it_val.it_value.tv_sec =     INTERVAL/1000;
  it_val.it_value.tv_usec =    (INTERVAL*1000) % 1000000;   
  it_val.it_interval = it_val.it_value;
  if (setitimer(ITIMER_REAL, &it_val, NULL) == -1) {
    perror("error calling setitimer()");
    exit(1);
  }

  while (1) 
    pause();

}

/*
 * DoStuff
 */
void DoStuff(void) {

  printf("Timer went off.\n");

}
于 2010-01-18T13:30:17.047 回答