强制函数在C中使用SIGALRM结束

时间:2011-02-11 01:44:09

标签: c signals

现在我有一个连接到SIGARLM的功能,它在1秒后熄灭,并且每次都会重新报警以再次启动。在我编写的SIGALRM函数的逻辑中有一个测试,看看是否已达到某个超时,当它发生时,我需要它来杀死一个正在运行的函数。有人知道我怎么做吗?

我忘了提到:在需要被杀死的函数中,它等待scanf(),即使scanf()尚未返回,函数也需要死掉。

5 个答案:

答案 0 :(得分:0)

不确定您要问的是什么或该程序的结构是什么。如果我理解正确:某个函数正在运行,如果它已经运行了X时间,你想要终止它。你有一个SIGALARM每秒唤醒,它会检查另一个函数的运行时间并终止。

你打算如何杀死这个功能?它是同一过程中的一个功能,还是一个单独的过程。您的问题是如何终止它或如何判断它何时需要终止?

我做过一些我认为相似的事情。我有一个多线程应用程序,其结构包含有关我希望监视的线程的信息。该结构包含成员变量“startTime”。我的监视(SIGALARM)函数可以访问线程列表。当监视器醒来时,它将遍历列表,将当前时间与每个线程startTime进行比较,如果超出了允许的运行时间,则向该函数发送消息。

这有帮助吗?

答案 1 :(得分:0)

您可以使用(全局)变量在信号处理程序和应该停止的函数之间进行通信。然后该函数将检查该变量以查看它是否仍应继续运行或是否应该退出。

这就行了:

volatile int worker_expired = 0;

void worker() {
   while (!worker_expired) {
      // ...
   }
}

void sig_alrm() {
   worker_expired = 1;
}

答案 2 :(得分:0)

如果您希望信号终止IO操作,您需要确保它是中断信号处理程序。在现代系统中,由信号中断的系统调用会自动重启,除非您另行指定。如果您想要控制这样的事情,请使用sigaction函数而不是signal函数来设置信号处理程序。使用sigaction,除非指定SA_RESTART,否则信号处理程序可能会中断。

如果你正在使用像read这样的文件描述符IO函数,你现在应该得到你想要的效果。

如果您正在使用stdiofscanf函数,则被信号中断会使FILE进入只能由clearerr清除的错误状态,并将丢失缓冲区中的任何部分输入。中断信号与stdio不能很好地混合,除非您只想中止文件上的所有操作并在接收到信号时关闭它。

答案 3 :(得分:0)

可能值得研究的一种方法是使用select轮询stdin并查看是否有任何数据准备就绪。 select允许你在文件描述符上等待一段时间,控制何时可以被打断以及什么,并且看起来它在这里是完美的。您可以坐在循环中等待一秒钟,然后如果没有可用的数据则优雅地失败。这样,SIGALRM就不需要杀死这个功能;它会自己处理这一切。

答案 4 :(得分:0)

所以......稍微重申一下:你想杀死这个函数并不是因为你希望任何挂起的i / o终止并退出函数。

我要么:

  1. 使用select()定期唤醒并检查信号处理程序设置的标志。如果没有设置标志并且没有输入挂起,则循环并再次调用select()。

  2. 我怀疑你的SIGALARM处理程序不只是检查这个计时器,所以使用pselect()检查i / o OR SIGALARM可能不适合你。我想知道你是否可以获取用户定义的信号,并将其传递给pselect。然后你的警报处理程序会发送用户定义的信号。

  3. 关于选择1,如果SIGALARM每秒唤醒,那么您可以调整select()睡眠时间在最大错误延迟范围内。换句话说,假设在调用select()之后立即发生超时,那么直到select()唤醒以检测SIGALARM处理程序设置的标志。因此,如果select()每秒唤醒10次,则可能需要1/10秒才能检测到“放弃”标志的设置(由SIGALARM处理程序设置)。