Question

GLibC a une méthode semtimedop qui vous permet d’effectuer une opération ( un sémaphore acquis dans ce cas ) qui expire après un certain temps. Win32 fournit également WaitForSingleObject qui fournit une fonctionnalité similaire.

Autant que je sache, il n’existe pas d’équivalent sur OSX ou d’autres Unices. Pouvez-vous suggérer l’équivalent pour semtimedop ou une solution de contournement pour terminer proprement un semop après un certain temps?

Était-ce utile?

La solution

Vous pouvez interrompre un appel semop () (et la plupart des autres appels bloquants) en obtenant un signal, tel que celui provoqué par alarm () .

exemple non testé:

#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 */
    /* ... */
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top