2009-09-10 3 views
4

GLibCには、特定の時間が経過した後にタイムアウトする操作(セマフォ取得、この場合は)を実行する方法semtimedopがあります。 Win32は同様の機能を提供するWaitForSingleObjectも提供しています。semtimedopのUNIX/OSXバージョン

私が見る限り、OSXやその他のUnixには同等のものはありません。 semtimedopに相当するものか、一定の時間が経過した後でsemopをきれいに終了させるための回避策を提案できますか?

答えて

2

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

アラームコールはあまりにもWindows上で利用できますか? –

+0

いいえ、 'alarm()'はPOSIX呼び出しであり、私はWindowsがシグナルの概念をサポートしているとは思いません。 (btw、私は私の答えを編集しました、実際には2つの別個の部分として書かれていました) – Hasturkun

+0

ありがとうございました。また、pthreadsはカーネルレベルのセマフォーではないので使いませんので、プロセス間では動作しません。 –