【发布时间】:2010-11-27 04:03:01
【问题描述】:
GLibC 有一个方法 semtimedop,它允许您执行在一定时间后超时的操作(在这种情况下为信号量获取)。 Win32 还提供了WaitForSingleObject,提供了类似的功能。
据我所知,在 OSX 或其他 Unices 上没有等价物。您能否建议 semtimedop 的等效项或在一定时间后干净地终止 semop 的解决方法。
【问题讨论】:
标签: c++ c macos unix semaphore
GLibC 有一个方法 semtimedop,它允许您执行在一定时间后超时的操作(在这种情况下为信号量获取)。 Win32 还提供了WaitForSingleObject,提供了类似的功能。
据我所知,在 OSX 或其他 Unices 上没有等价物。您能否建议 semtimedop 的等效项或在一定时间后干净地终止 semop 的解决方法。
【问题讨论】:
标签: c++ c macos unix semaphore
您可以通过获取信号(例如由alarm() 引起的信号)来中断semop() 调用(以及大多数其他阻塞调用)。
未经测试的示例:
#include <signal.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
volatile int alarm_triggered = 0;
void alarm_handler(int sig)
{
alarm_triggered = 1;
}
int main(int argc, char **argv)
{
int rc;
/* set up signal handler */
signal(SIGALRM, alarm_handler);
/* ... */
alarm(30); /* 30 second timeout */
rc = semop(...);
if (rc == -1 && errno == EINTR)
{
if (alarm_triggered)
{
/* timed out! */
}
}
alarm(0); /* disable alarm */
/* ... */
}
【讨论】:
alarm() 是一个 POSIX 调用,我认为 Windows 不支持信号的概念。 (顺便说一句,我编辑了我的答案,实际上是写成两个独立的部分)