Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Pourquoi mon named pipe est toujours en mode line buffered ?

2 réponses
Avatar
Eric Bart
Bonjour,

Sous linux je crée un named pipe
mkfifo("PIPE",0666);

Après un fork() j'ai
int iFifo = open("PIPE", O_RDONLY);
iLus = read(iFifo,cBuff,19);
ou
iFifo = open("PIPE", O_WRONLY);
int iRes = write(iFifo,cBuff,size);


Mais le read n'est immédiat que si je termine le buffer
transmis par un "\n"

J'ai essayé de transformer le fd en stream avec fdopen() et
d'empêcher le line-buffer avec setbuf() mais ça ne marche pas.

2 réponses

Avatar
Eric Bart
Le "line buffered", ca ne s'applique qu'a stdio, pas aux appels
systeme read ou write. M'est avis que le buffering que tu
observes est au niveau du printf ou puts que tu utilises pour
afficher le resultat du read.


Hompfffff ... Ben oui. Merci. Bien vu et bravo.

Je faisais un cout << ...
avec un cerr << ...
le problème disparait. cerr n'est pas en line buffered.

Pffff.

Avatar
Stephane Chazelas
2004-05-25, 11:22(+02), Eric Bart:
Sous linux je crée un named pipe
mkfifo("PIPE",0666);

Après un fork() j'ai
int iFifo = open("PIPE", O_RDONLY);
iLus = read(iFifo,cBuff,19);
ou
iFifo = open("PIPE", O_WRONLY);
int iRes = write(iFifo,cBuff,size);


Mais le read n'est immédiat que si je termine le buffer
transmis par un "n"

J'ai essayé de transformer le fd en stream avec fdopen() et
d'empêcher le line-buffer avec setbuf() mais ça ne marche pas.
[...]


Le "line buffered", ca ne s'applique qu'a stdio, pas aux appels
systeme read ou write. M'est avis que le buffering que tu
observes est au niveau du printf ou puts que tu utilises pour
afficher le resultat du read.

--
Stephane