UNIX / OSX версия семимедопа - PullRequest
4 голосов
/ 10 сентября 2009

GLibC имеет метод semtimedop, который позволяет вам выполнить операцию ( получение семафора в этом случае ), которая истекает через некоторое время. Win32 также обеспечивает WaitForSingleObject, что обеспечивает аналогичную функциональность.

Насколько я вижу, нет эквивалента в OSX или других Unices. Можете ли вы предложить либо эквивалент для semtimedop, либо обходной путь для завершения семопа через определенное количество времени.

1 Ответ

2 голосов
/ 10 сентября 2009

Вы можете выйти из вызова 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 */
    /* ... */
}
...