2009-12-29 7 views
0

J'émigre un programme LynxOS à une distribution ubuntu et gcc 4.1.3Posix evtsuspend équivalent

Je suis presque fait, mais j'ai un problème, je reçois SIGALRM qui force mon programme pour quitter. Je ne sais pas pourquoi je reçois ces signaux si je n'appelle pas à l'alarme (x).

Je l'ai arrondi avec une sigaction, mais mon programme ne fonctionne pas correctement mq_receive échoue chaque fois que SIGALRM est reçu.

Je me demande si elle pourrait être à cause de cette traduction de code:

#include <events.h> 
#include <timers.h> 

evtset_t EvtMask; 
struct timespec Time; 

Time.tv_sec = 2; 
Time.tv_nsec = 0; 
evtsuspend (&EvtMask, &Time); 

serait maintenant

sleep(2); 

Voici les informations sur evtsuspend donnée par LynxOS:

evtsuspend (ne peux pas insérer l'image en raison de mon manque de réputation)

Pensez-vous qu'ils fonctionnent de la même manière? (sans spécifier un masque d'événement) sleep() attend également qu'un SIGALRM continue.

Merci et salutations

Répondre

3

1) Essayez d'exécuter strace sur votre programme pour voir si vous pouvez en savoir plus d'informations.

Ce serait bien d'avoir plus de détails sur votre programme ... mais peut-être que cela vous aidera. Il est possible que expire. Je pense que que SIGALRM est utilisé pour notifier les applications pour les appels système expiré.

Ou plus probablement, vous utilisez autre chose qui cause SIGALRM dans votre code, à savoir: setitimer(). Pour votre question sur l'utilisation de sleep (2) sur Linux. Si vous voulez que le programme se bloque pendant l'appel de veille (2), alors oui, vous devriez pouvoir l'utiliser. Si vous ne voulez pas le bloquer, commencez un minuteur d'intervalle setitimer() et utilisez-le. Note: setitimer() utilise SIGALRM lorsque la minuterie se déclenche ... voir le manpage pour plus de détails.

0

Je vois c'est un vieux sujet, mais voici une réponse à la mq_receive() partie de votre question:

mq_receive() débloquera lorsqu'un signal est reçu. Lorsque cela se produit, le code de retour sera défini sur -1 et errno sera défini sur EINTR. Vous pouvez enrouler le code autour de votre appel à mq_receive() pour vérifier cela et le rappeler si nécessaire.