Bonjour,
J'ai un petit souci sur un projet en cours...
En fait, j'ai plusieurs processus en exécution.
J'ai la possibilité d'établir une communication entre un premier processus (admin) et un autre processus.
Pour ce faire, soit l'admin envoie un signal au processus concerné, soit le processus concerné envoie un signal à l'admin pour demander une communication.
Une fois la communication établie (qui se fait via file de messages), l'admin est considéré comme occupé, et si un autre processus demande une communication, il doit attendre 5 secondes et continuer son exécution jusqu'à ce que l'admin soit libre.
Donc :
Du côté admin, rien de spécial, il envoie et reçoit les messages par la file de messages.
En revanche, du côté de l'autre processus, lors du début de l'appel, je décrémente un sémaphore (qui a été initialisé à 1 par un autre processus). Donc, si un deuxième processus demande une communication, il ne parvient pas à décrémenter le sémaphore, vu qu'il est déjà à 0. Et c'est là que ça coince... J'aimerais que ce deuxième processus continue son exécution jusqu'à ce que l'admin soit à nouveau libre.
Voici donc le code que j'ai dans l'autre processus :
ce code se trouve dans une fonction handler, car l'appel est lancé via un signal. A la fin de la fonction handler se trouve un longjmp, afin de retourner à l'exécution du processus avant l'appel.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 sembuf op; op.sem_num = 0; op.sem_op = -1; op.sem_flg = 0; alarm(5); if(!semop(idSem, &op, 1)) { alarm(0); appel(); //Appel vers l'admin } op.sem_op = +1; semop(idSem, &op, 1);
Je pense que je n'ai pas trop compris l'utilisation de alarm()...
En effet, avec le code ci-dessus, si un deuxième processus demande une communication, il s'arrête complètement pendant 5 secondes, et ensuite est terminé, et j'ai un message alarm qui est affiché dans le terminal du processus...
Comment puis-je faire ?
Merci beaucoup !
Partager