SELECT FD_SET

Fermé
RMEU Messages postés 31 Date d'inscription mercredi 10 avril 2013 Statut Membre Dernière intervention 10 novembre 2014 - 10 nov. 2014 à 14:10
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 - 11 nov. 2014 à 12:44
Bonjour,

J'utilise select pour déterminer les événements qui se sont produits sur une série de SOCKET (attention en windows, un SOCKET n'est pas un File Descriptor). select reste bloqué jusq'au moment où un événement se produit sun un SOCKET (READ, WRITE, EXCEPTION) ou lorsque le timer passé comme paramètre à select s'est écoulé. J'aimerais savoir si select bloque le process ou la thread dans laquelle il s'exécute.
Merci d'avance pour vos réponses.

RMEU



3 réponses

sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
10 nov. 2014 à 20:55
Bonsoir
Tu confonds pas mal de chose , et il me semble que tu n'as pas vraiment compris le rôle de la fonction
select()
et du fameux
FD_SET()
et surtout le rôle de la fonction
select()
dans ta programmation réseaux.

Avant tout , il faut savoir que la fonction
select()
ne fait que renvoyer le nombre de descripteur déjà prêt et par la même occasion, modifier l'ensemble des descripteurs pour en laisser que ceux qui sont véritablement prêts à être utilisé et par la même occasion , j'affirme qu'il y a mise en attente de processus par invocation de la macro
SELECT
.
J'insiste sur ce points en précisons qu'il met en attente le processus mais ne le bloque pas pour faire un traitement et ensuite le débloqué .
Et c'est aussi là que réside véritablement le rôle de la fonction
select() 
le ou les processus en question ne peuvent sortir de leurs attentes à condition que la fonction
select() 
renvoie une valeur différente de nul et par la même occasion, cela veux dire que l'ensemble des éléments de départs contienne chacun des descripteurs qui sont prêts à être utilisé dans le cas contraire la fonction
select 
ferme automatiquement la socket en question mais pas le reste.
En plus simple il ferme un service donnée parmi tant d'autres et cela définie son rôle dans la conception d'un serveur applicatif qui doit être en attente sur plusieurs sockets à la fois( mode multi-clients), il régule également l'ordre d'arrivée des requêtes cliente c'est lui l'abrite du système.
Bref sans rentrer en encore plus en profondeur voilà ce qu'il faut comprendre plus ou moins de la fonction
select()
.

Quant à la fonction
 FD_SET() 
elle ne fait qu'ajouter à la socket l'ensemble du descripteur en plus clair il lui fournit les informations nécessaires sur lequel il doit mettre le processus en attente (en gros il lui fournie une sorte de ID )
Sans informations de
FD_SET
la fonction
select
fermera le service automatiquement.

Et enfin pour répondre à ta question @RMEU: J'aimerais savoir si select bloque le process ou la thread dans laquelle il s'exécute.

 select 
met en attente une socket ou la ferme sans poser de question tout dépend de ta conception et tout fork</code> où <gras>thread sont exécutés après la fonction
 accept()
ou
recvfrom()
mode multi-clients oblige.

à bientôt

0
RMEU Messages postés 31 Date d'inscription mercredi 10 avril 2013 Statut Membre Dernière intervention 10 novembre 2014
10 nov. 2014 à 21:26
Bonsoir,

Merci pour ta réponse, mais tout cela je le savais déjà; désolé si mon texte n'est pas clair. Je veux juste savoir si l'appel à select bloque le process ou la thread dans laquelle il s'exécute. select ne peut se terminer que sur un timeout qui a été précisé lors de l'appel (voir syntaxe de sélect) ou être interrompu par un signal traité par un signal handler. Bien sur, sélect se termine quand un événement se produit sur un des sockets précisés dans un des 3 FD_SET (read, write exception) et bien d'accord avec toi, il retourne le nombre de sockets à examiner. Je pense que ma question principale : (process bloqué ou thread) reste valable.
Merci d'avance.
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
11 nov. 2014 à 12:44
Bonjour
@RMEU :bloque le process ou la thread dans laquelle il s'exécute. select ne peut se terminer que sur un timeout qui a été précisé lors de l'appel (voir syntaxe de sélect) ou être interrompu par un signal traité par un signal handler.

Je pense que je n'ai pas été clair, que veux-tu dire par "processus qui l'exécute" pour moi d'après ce que je comprends, celui-ci est lancé dans un processus déjà exécuté et que tu souhaites savoir si celui-ci est bloqué ou pas ?
Si c'est le cas la réponse et non et je reviens sur ce que j'ai dit la fonction
select 
surveillent des ensembles de descripteurs et par la même occasion regarder s'il y a une nouvelle connexion en gros il ne bloque pas de processus dans lequel il est exécuté mais il met en attentes certaines descriptrices de la SOCKET.

Quant au timer ce n'est que pour dire au client il a X temps pour fournir une requête ou donner cas contraire la socket client est automatiquement fermer en plus clair (et tout depend du programme) si tu ne souhaiter pas attendre indéfiniment que quelqu'un t'envoi des data... il passe à autre choses voilà un peu son rôle et le programme continuera à fonctionner de plus la fonction
select()
peut travailler sans timer il te suffit de passer nul et dès le premier descripteur actif il s'exécute cas contraire rien or close.
Donc, la fonction met en attente mais n'est pas bloquante pour d'autre sockets déjà actifs
contrairement à
accept()


Pour Conclure, ton processus fonctionnera mais à l'intérieur de celui-ci et la fonction
 select() 
attendra un descripteur valide à un temps donné si tu la définis ou pas et continuera ou meurt par la suite peut importe. Et tous les processus que tu lanceras auront chacune une indépendance vis-à-vis des autres, les fonctions de select du processus 1 n'est pas la même que le processus 2

à bientôt

0