Version UNIX / OSX de semtimedop
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?
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