UNIX / OSX版本的semtimedop

时间:2009-09-10 12:57:02

标签: c++ c macos unix semaphore

GLibC有一个方法semtimedop,它允许你执行一个操作(这种情况下的信号量获取),在一定时间后超时。 Win32还提供了WaitForSingleObject,它提供了类似的功能。

据我所知,在OSX或其他Unices上没有相应的内容。你能否建议semtimedop的等价物或者在一定时间后干净地终止semop的解决方法。

1 个答案:

答案 0 :(得分:2)

您可以通过获取信号(例如由semop()引起的信号)来中断alarm()来电(以及大多数其他阻止来电)。

未经测试的例子:

#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 */
    /* ... */
}