2009-09-10 6 views
4

GLibC dispose d'une méthode semtimedop qui vous permet d'effectuer une opération (acquiert un sémaphore dans ce cas) qui expire après un certain laps de temps. Win32 fournit également WaitForSingleObject qui fournit une fonctionnalité similaire. Pour autant que je puisse voir, il n'y a pas d'équivalent sur OSX ou d'autres Unices. Pouvez-vous suggérer soit l'équivalent pour semtimedop ou une solution de contournement pour terminer un semop après un certain laps de temps proprement.Version UNIX/OSX de semipledop

Répondre

2

Vous pouvez sortir d'un appel semop() (et de la plupart des autres appels bloquants) en obtenant un signal, comme 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 */ 
    /* ... */ 
} 
+0

L'appel d'alarme disponible également sous Windows? –

+0

Non, 'alarm()' est un appel POSIX, et je ne pense pas que Windows supporte le concept de signaux. (btw, j'ai édité ma réponse, a été réellement écrit en deux parties séparées) – Hasturkun

+0

Merci. De plus, les trucs pthreads ne sont d'aucune utilité car ce n'est pas un sémaphore au niveau du noyau qui ne fonctionnera donc pas à travers les processus. –