OVH Cloud OVH Cloud

retour de la fonction select() et zéro caractères dispo ...

6 réponses
Avatar
Eric Bart
Bonjour,

sous linux j'utilise select() pour la réception sur
un pipe. Tout se passe bien jusqu'à ce que l'autre
programme ferme son pipe en écriture. Alors select()
se déclenche infiniment sans qu'il y ait de caractère
dispo !!??

Why ?

Si je ferme alors le pipe en lecture pour le rouvrir aussitôt,
tout redevient normal.

Quel newsgroup anglais (ou français) serait le mieux adapté
pour cette question ?

----PRG1---------
Ouverture du pipe en lecture :
// without O_NONBLOCK, the program blocks until the pipe write end is open
iAgiPipeFD = open(sPipeFileName.c_str(), O_RDONLY|O_NONBLOCK);

----PRG2--------------
Ouverture du pipe en écriture :
iWriteFifo = open(sTmp.c_str(), O_WRONLY);

Ligne créant une infinité de select() nul :
if ( close(iWriteFifo) == -1)
------------------

6 réponses

Avatar
DINH Viêt Hoà

Bonjour,

sous linux j'utilise select() pour la réception sur
un pipe. Tout se passe bien jusqu'à ce que l'autre
programme ferme son pipe en écriture. Alors select()
se déclenche infiniment sans qu'il y ait de caractère
dispo !!??

Why ?

Si je ferme alors le pipe en lecture pour le rouvrir aussitôt,
tout redevient normal.


quand tu lis zéro caractères, c'est que le flux distant a été fermé.
Dans ton cas, il s'agit du côté écriture du pipe qui a été fermé.
Tu sais qu'il faut fermer le côté lecture lorsque tu lis zéro
caractères.

--
DINH V. Hoa,

"s/^((.|[^[]|[(^.|[^^])[^]]*])*)([^*[])/14/"
-- Stéphane CHAZELAS

Avatar
Eric Bart
quand tu lis zéro caractères, c'est que le flux distant a été fermé.
Dans ton cas, il s'agit du côté écriture du pipe qui a été fermé.
Tu sais qu'il faut fermer le côté lecture lorsque tu lis zéro
caractères.


Merci. Je voulais utiliser ce "named pipe" en lecture pour plusieurs
pipe en écriture, comme une sorte de serveur. A chaque fois que le
pipe en lecture reçoit, il sait quel pipe ouvrir et utiliser pour
répondre. C'est pour ça que je voulais laisser le pipe en lecture
toujours ouvert.

D'après ce que vous me dites, je me demande s'il est possible d'envisager
plusieurs ouvertures d'un pipe en écriture vers un pipe en lecture ouvert
une seule fois ...

Devrais-je plutôt utiliser des sockets ?
L'inconvénient des sockets est qu'on ne sait pas forcément si le port
souhaité est innutilisé par le système. Est-ce différent avec les sockets unix ?

Ouf ! Merci

Avatar
Laurent Wacrenier
Eric Bart écrit:
L'inconvénient des sockets est qu'on ne sait pas forcément si le port
souhaité est innutilisé par le système.


Avec les socket IP, on peut binder sur un port aléatoire.

Est-ce différent avec les sockets unix ?


Pour les socket unix, la ressource qui les identifie sur le système
est un fichier. On peut aussi ouvrir des socket anonymes avec
socketpair().

Si l'application reste sur une même machine, il faut utiliser les
socket unix.

Avatar
DINH Viêt Hoà

Eric Bart écrit:
L'inconvénient des sockets est qu'on ne sait pas forcément si le port
souhaité est innutilisé par le système.


Avec les socket IP, on peut binder sur un port aléatoire.


correction : un port déterminé au mieux par le système d'exploitation :)

--
DINH V. Hoa,

"s/^((.|[^[]|[(^.|[^^])[^]]*])*)([^*[])/14/"
-- Stéphane CHAZELAS


Avatar
Eric Bart
"Laurent Wacrenier" <lwa@ teaser . fr> wrote in message news:
Eric Bart écrit:
L'inconvénient des sockets est qu'on ne sait pas forcément si le port
souhaité est innutilisé par le système.


Avec les socket IP, on peut binder sur un port aléatoire.


Mais il faut quand même connaitre le port du serveur, non ? Ce port serveur
ne doit pas non plus être en conflit avec un autre serveur.


Est-ce différent avec les sockets unix ?


Pour les socket unix, la ressource qui les identifie sur le système
est un fichier. On peut aussi ouvrir des socket anonymes avec
socketpair().

Si l'application reste sur une même machine, il faut utiliser les
socket unix.


Oui. Il s'agit d'un prg serveur et de plusieurs clients qui tournent
sur la même machine. Merci de me dire quelle est la commande qui
permet de créer des sockets unix compatibles entre eux pour chaque
programme sans avoir à définir à l'avance de port réservé.


Avatar
Laurent Wacrenier
Eric Bart écrit:
Avec les socket IP, on peut binder sur un port aléatoire.


Mais il faut quand même connaitre le port du serveur, non ?


Le serveur le connait. Il peut être transmis au client par un
mécanisme hors bande (à la main, par exemple ou par une socket de
contrôle comme le fait FTP)

Ce port serveur
ne doit pas non plus être en conflit avec un autre serveur.


C'est comme ça que ça marche.

Oui. Il s'agit d'un prg serveur et de plusieurs clients qui tournent
sur la même machine. Merci de me dire quelle est la commande qui
permet de créer des sockets unix compatibles entre eux pour chaque
programme sans avoir à définir à l'avance de port réservé.


Il n'y a pas de port pour les sockets unix, mais éventuelement un
chemin du système de fichier. Passer ça à bind() ou à connect() dans
une struct sockaddr_un. Pour des sockets unix sans nom, utiliser
socketpair().