linux - 在 Linux 中用 C 语言阻止 alarm()

标签 linux block synchronization alarm

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

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

最佳答案

实现此目的的一种方法是安装信号处理程序。

类似于下面的伪代码:

int alarm_received;

my_handler(int sig) {
   alarm_received =1;
}

void disable_alarm(void)
{
  alarm_received = 0;
  signal(SIGALRM, my_handler);
}

void (enable_alarm(void))
{
  if (alarm_received)
    exit(1);
  signal(SIGALRM, SIG_DFL);
}

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

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

关于linux - 在 Linux 中用 C 语言阻止 alarm(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16493224/

相关文章:

linux - 无法将读取输入传递到 cat 路径

xml - 使用 linux 实用程序从文件中提取正则表达式。在单独的行上打印每个匹配项

滚动时出现 CSS/Chrome 白色 block

database - Talend Open Studio For MDM + Postgresql + 同步两个数据库

c++ - MPI 同步 vector 矩阵

java - 当 OP_ACCEPT 事件发生时,解复用器是如何被通知的

linux - if else 语句中出现意外的文件结尾错误

java - 如何以毫秒精度同步 2 个系统之间的时间?

java - OSX 阻止 JNLP 启动 Java1.8U40 - 有人知道为什么吗?

jquery:速记 - 对多个 id 不显示任何内容