0

我需要一个有时间限制的程序。

所以,我使用alarm()函数在时间限制内退出程序。

但是我有同步的问题。

在我的程序中有一个临界区,所以如果在临界区发生超时,那么我想在临界区之后推迟警报。

像这样:

main() {
  alarm(5);
  ...

  disable_alarm();

  //critical section; program shouldn't exit during this section
  {...} 

  enable_alarm(); //if alarm happens during it's disabled, program must exit here.

  ... 
}

disable_alarm()在这种情况下,我应该为和使用哪个函数enable_alarm()

4

2 回答 2

2

一种方法是安装信号处理程序。

类似于以下伪代码

int alarm_received;

我的处理程序(int sig){
   警报接收=1;
}

无效禁用警报(无效)
{
  警报接收 = 0;
  信号(SIGALRM,my_handler);
}

无效(启用警报(无效))
{
  如果 (alarm_received)
    退出(1);
  信号(SIGALRM,SIG_DFL);
}

您可能应该使用 sigaction() 而不是 signal(),因为这是一个好习惯。

或者, sigprocmask() 可能是您正在寻找的解决方案,具体取决于阻塞信号的确切含义。如果阻塞的信号保持未决状态,则在未屏蔽时会传递 abd,sigprocmask() 是解决您问题的更简单的解决方案。

于 2013-05-11T03:45:56.910 回答
0

在 Linux 上,您还可以使用poll(2)timerfd_create(2),假设您想在某些时候测试是否已达到计时器。

于 2013-05-11T06:58:34.533 回答