代码之家  ›  专栏  ›  技术社区  ›  Mike McQuaid

SemtimeDop的Unix/OSX版本

  •  4
  • Mike McQuaid  · 技术社区  · 15 年前

    glibc有一个方法 semtimedop 允许您执行操作( 本例中的信号量获取 )过了一段时间后就会超时。Win32还提供 WaitForSingleObject 它提供了类似的功能。

    据我所知,在OSX或其他Unices上没有类似的功能。您是否可以建议SemTimeDop的等效方案,或者建议在一定时间后彻底终止SemOp的解决方案?

    1 回复  |  直到 15 年前
        1
  •  2
  •   Hasturkun    15 年前

    你可以从一个 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 */
        /* ... */
    }