4

GLibCには、一定時間後にタイムアウトする操作(この場合はセマフォ取得semtimedop)を実行できるメソッドがあります。Win32は、同様の機能を提供するものも提供します。WaitForSingleObject

私が見る限り、OSXや他のUnicesには同等のものはありません。semtimedopと同等のもの、または一定時間後にsemopをクリーンに終了するための回避策のいずれかを提案できますか。

4

1 に答える 1

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 */
    /* ... */
}
于 2009-09-10T13:10:37.383 に答える