Bonjour,
mon application réseau communique sur plusieurs sockets via UDP. L'ensemble des sockets et stoqué dans un tableau de taille fixe mais dont le nombre d'élément et leur position varie au cours du temps (à cause d'ajout ou de suppression dans le tableau).
J'aimerais lire sur toutes les sockets en même temps, attendant d'un certain message et ce dans le même thread, du coup je pense aux entrée sorties non bloquantes via poll en utilisant un tableau de pollfd de la même structure que mon tableau. Le problèmé étant que la structure du tableau change, il faut donc que poll le prenne en compte, il faudra même le réveiller en cas de changement car poll est bloquant.
Je viens de découvrir ppoll qui elle prend aussi un sigmask_t de sorte qu'elle soit réveiller en cas de réception de certains signaux, ça devrait faire l'affaire.
Malheureusement je n'arrive pas à interrompre ppoll...
Dans le thread de gestion des messages j'ai:
Et dans le thread qui modifie la structure du tableau
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
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 sigset_t mask; sigemptyset (&mask); sigaddset (&mask, SIGUSR1); char buff[513]; int ret; while (1) { debug("mdiff_manager", "ppoll number %d...", ++count); int ret = ppoll(poll_mdiff, nring+1, NULL, &mask); if (ret > 0) { int found = 0; for (int i = 0; i < nring; ++i) { if (poll_mdiff[i].revents == POLLIN) { found = 1; int rec1 = recv(poll_mdiff[i].fd, buff, 512, 0); if (rec1 >= 0) { buff[rec1] = 0; debug("mdiff_manager", "message received: %s", buff); if (strcmp(buff, "DOWN")) rm_ring(i); } else { printf"poll_mdiff[%d].revents == POLLIN whereas recv returns %d", i, rec1); } } } if (!found) printf("Is it SIGUSR1?"); } else { printf("pprol retval: %d", ret); }
Ou thread->mdiff_manager et le thread de gestion des messages.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 int r = pthread_kill(thread->mdiff_manager, SIGUSR1);
Le résultat de pthread_kill est bien 0, par défaut ce qu'il se passe c'est que le programme quitte à cause du signal SIG_USR1, pourtant il devrait être capté par ppoll.
J'ai donc ajouté avant la boucle while
maintenant le signal est simplement ignoré, mais toujours pas pris en compte par ppoll.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 signal(SIGUSR1, SIG_IGN);
Je n'ai trouvé aucun exemple sur internet et la documentation ne répond pas à mon problème, si quelqu'un sait comment utiliser ppoll ou a déja rencontré ce problème je lui serais vraiment reconnaissant de bien bien vouloir partager son expérience.
Merci.
Partager