【问题标题】:block alarm() in C in LinuxLinux 中 C 语言中的 block alarm()
【发布时间】:2013-05-11 02:38:30
【问题描述】:

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

所以,我使用了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() 使用哪个函数。

【问题讨论】:

    标签: linux block sync alarm


    【解决方案1】:

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

    类似于以下伪代码

    int alarm_received; 我的处理程序(int sig){ 警报接收=1; } 无效禁用警报(无效) { 警报接收 = 0; 信号(SIGALRM,my_handler); } 无效(启用警报(无效)) { 如果 (alarm_received) 退出(1); 信号(SIGALRM,SIG_DFL); }

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

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

    【讨论】:

    • 好,但你应该声明volatile sigatomic_t alarm_received;
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-21
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      • 2020-01-10
      • 1970-01-01
      相关资源
      最近更新 更多