Linux和Windows上的警报功能 - 找不到Windows的等效功能 - C

4

我已经在Linux上工作了一段时间,写过一些C程序,现在我需要为Windows构建一个应用程序,但是很难找到替代signal.h中闹钟功能的方法...

问题在于,在Linux中,当你将闹钟标志设置为SIGALRM时(如果没有错误),操作系统会在闹钟响起时执行某些函数。 例如:

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

这个例子中,操作系统将会每隔2秒调用一次myfunc函数(在Windows中可能是毫秒级别的,但现在不要关注这个细节)。
我已经搜索了一段时间如何在Windows上做同样的事情(目前仅使用windows.h),但我找不到替代方法(在msdn上搜索了成千上万次),而且在Windows上没有signal.h中的SIGALRM标志.....
在C语言中,我应该使用什么来实现与带有SIGALRM标志的alarm相同的行为?(换句话说,使用定时器或类似的函数来执行另一个函数)。
2个回答

3

请查阅MSDN中的timeSetEvent。虽然不完全与alarm相同,但可能足够接近。


1
谢谢你的帮助 - 我最终使用了 CreateTimerQueueTimer,因为MSDN上已经警告过它的过时,而且它运行得很好。虽然它只能以毫秒为单位计时,可能没有POSIX版本那么精确,但对我来说已经足够了。+1 - Thomas

3
使用 alarm/SIGALRM 不是一种安全的方式来“在给定时间运行函数”,因为该函数在信号处理上下文中被调用,几乎任何库函数的使用都是不安全的。我所知道的唯一好用途的是使用SIGALRMsigaction 来设置一个无操作的信号处理程序以中断系统调用,以便您期望可能会挂起的系统调用被中断并返回EINTR
如果您想要在 N 秒后执行某个任务,最安全的方法是启动一个新线程,让其睡眠 N 秒,然后执行该任务。这应该可以在任何带有线程的操作系统上工作。
Windows 也有自己的定时器事件,可以通过 Windows 消息系统传递,但使用它们将使您的代码更加面向 Windows。

这也是一个非常好的解决方案,谢谢!在我的情况下,不需要创建线程来完成这个任务,但我会记在心里。 - John

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接