2010-12-14 6 views
0

Nous utilisons une file d'attente de messages System V avec la fonction msgrcv appelée en mode bloquant. Nous voulons implémenter un temporisateur sur la fonction de blocage msgrcv afin que lorsque le temporisateur expire et que nous n'avons pas reçu de message, nous pouvons débloquer msgrcv et continuer l'exécution.System V IPgr msgrcv with timer Howto

Avez-vous des suggestions sur la façon de réaliser cela en programmant? J'ai résolu ce problème en utilisant un signal d'alarme.

+0

double possible de http://stackoverflow.com/questions/4110198/system- v-message-queue-timed-receive – jschmier

Répondre

2

S'il vous plaît vérifier le programme suivant si elle aide:

int msg_recv(int id, MSG_DATA *msgptr) 
{ 

    int n; 


    **alarm(2);** //After 2 second msg_recv interrupt and return errno "Interrupted system call" 

    n = msgrcv(id, (MSG_DATA *) msgptr, sizeof(MSG_DATA) , 0, 0); 

    perror("Return from msgrcv"); 

    printf ("N = %d\n %d %s\n\n",n,errno,strerror(errno)); 

    if (n < 0) //goto LOOP; // This forces the interrupted msgrcv to repeat 
    return(n); 
} 




void sigalrm_handler() 
{ 
    printf("Alarm signal delivered !\n"); 

    return; 
} 




int main(); 


int main() 
{ 
    //signal (SIGALRM, times_up);   /* go to the times_up function */ 
             /* when the alarm goes off.  */ 
    **signal(SIGALRM, sigalrm_handler);**  

    int msqid;       /* return value from msgget() */ 

    MSG_DATA msg_data; 

    msqid = 0; 



    printf("Ready to receive ... \n"); 

    **msg_recv(msqid, &msg_data);** 

    printf("read message \n"); 


    return 0;        
} 
0
gestionnaire de signaux

a un int param:

void sigalrm_handler(int) 
{ 
    printf("Alarm signal delivered !\n"); 
    return; 
}