4

我已经在 Linux 上工作了一段时间并做了一些 C 程序,现在我需要为 Windows 构建一个应用程序,但很难找到警报功能的替代品(在 signal.h 上找到)......

问题是,在 Linux 中,当您将警报标志设置为 SIGALRM(如果没记错的话)时,操作系统要做的是在警报响起时执行某些功能。例子:

signal(SIGALRM, myfunc);
alarm (2);

在这个例子中将会发生的是操作系统将每 2 秒调用一次函数 myfunc(在 Windows 中可能会是毫秒,但现在不要介意这个细节)。

我已经搜索了一段时间如何在 Windows 上执行相同的操作(仅使用 windows.h atm),但我找不到替代品(在 msdn 上搜索了数千次),并且在 Windows 上没有 SIGALRM 标志在信号上.h......

我可以在 C 中使用什么来执行与带有 SIGALRM 标志的警报相同的行为?(换句话说,一个允许使用警报或类似功能执行另一个函数的函数)。

4

2 回答 2

3

检查 MSDN 以获取timeSetEvent. 它与 不完全相同alarm,但可能足够接近。

于 2010-12-22T17:26:31.107 回答
3

使用alarm/SIGALRM不是“在给定时间运行函数”的安全方式,因为函数在信号处理上下文中被调用,其中使用几乎所有库函数都是不安全的。实际上,我所知道的唯一好的用途SIGALRM是设置一个无操作信号处理程序sigaction来中断系统调用,以便您期望可能挂起的系统调用被EINTR.

如果你想N从现在开始几秒钟内执行给定的任务,最安全的方法是启动一个新线程,它会N在几秒钟内休眠然后执行任务。这应该适用于任何具有线程的操作系统。

Windows 也有自己的计时器事件类型,可以通过 Windows 消息系统传递,但使用它们将使您的代码更加以 Windows 为中心。

于 2010-12-22T17:27:08.410 回答