Re: Problèmes bizarres de lecture dans un pipe (en C).

Liste des GroupesRevenir à fcol configuration 
Sujet : Re: Problèmes bizarres de lecture dans un pipe (en C).
De : nicolas$george (at) *nospam* salle-s.org (Nicolas George)
Groupes : fr.comp.os.linux.configuration
Date : 14. Dec 2022, 11:37:57
Autres entêtes
Organisation : Guest of ProXad - France
Message-ID : <63999974$0$3182$426a74cc@news.free.fr>
References : 1 2 3
User-Agent : Flrn (0.9.20070704)
Olivier Miakinen , dans le message <tnagqb$jpi$1@cabale.usenet-fr.net>,
 a écrit :
Sur d'autres machines avec le même programme, quand on dit qu'on est
capable de lire 10 000 octets et qu'il y en a déjà 30 000 en attente,
le read retourne bien 10 000 octets. Je ne vois pas pourquoi il serait
souhaitable de n'en retourner que 4 096 si tout le monde est d'accord
pour 10 000.
 
Ce qui n'empêche pas de boucler, bien sûr, pour récupérer les 20 000
octets qui restent (voire plus lorsque le fils continue à fournir).

Effectivement, j'ai lu un peu trop vite. Ce que tu décris est un
comportement acceptable mais pas souhaitable.

Mais ça ne correspond pas non plus à ce que j'observe, avec :

{ strace -Tttt -o /dev/pts/14 perl -e '$| = 1; syswrite STDOUT, "X" x 30000'; sleep 2 } | strace -Tttt -o /dev/pts/15 perl -e 'sysread STDIN, $buf, 40000'

… je vois :

1671009300.373032 write(1, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"..., 30000) = 30000 <0.000018>
1671009300.372976 read(0, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"..., 40000) = 30000 <0.000089>

Donc le read se satisfait des 30000 sans attendre les 40000 (souhaitable),
mais lit quand même plus que 4096.

(Ne me demande pas pourquoi le timestamp prétend que read() s'est terminé
avant que write() commence.)

Un exemple minimal, pas vraiment, mais oui je peux montrer un strace.
En fait je peux même montrer une analyse minimale d'un strace qui
n'était pas du tout minimal.
 
Dans les traces qui suivent, j'ai supprimé tout que ce n'est pas un
write(8, ...) du fils ou un read(7, ...) du père, et j'ai réordonné
les lignes pour que chaque read() suive le write() correspondant,
mais j'ai laissé le numéro de ligne de la trace d'origine. On voit
donc en premier le numéro de ligne (de 253 à 334), en second le
PID (4955 pour le père, 4956 pour le fils), puis le read ou le
write avec les premiers octets en hexadécimal.

Mais que vois-tu de suspect dans ce strace ?

Je fais un essai de mon côté :

strace -Tttt -o /dev/pts/14 perl -e '$| = 1; syswrite STDOUT, "X" x 4096 . "Y" x 4096' | strace -Tttt -o /dev/pts/15 perl -e 'sysread STDIN, $buf, 4090; sysread STDIN, $buf, 4000;'

1671010596.009083 write(1, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"..., 8192) = 8192 <0.000011>
1671010596.009071 read(0, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"..., 4090) = 4090 <0.000027>
1671010596.009115 read(0, "XXXXXXYYYYYYYYYYYYYYYYYYYYYYYYYY"..., 4000) = 4000 <0.000008>

On voit bien que le 2e read a reçu les 6 X qui restaient.

Date Sujet#  Auteur
13 Dec 22 * Problèmes bizarres de lecture dans un pipe (en C).9Olivier Miakinen
13 Dec 22 +* Re: Problèmes bizarres de lecture dans un pipe (en C).7Nicolas George
13 Dec 22 i`* Re: Problèmes bizarres de lecture dans un pipe (en C).6Olivier Miakinen
13 Dec 22 i +- Re: Problèmes bizarres de lecture dans un pipe (en C).1Olivier Miakinen
14 Dec 22 i `* Re: Problèmes bizarres de lecture dans un pipe (en C).4Nicolas George
14 Dec 22 i  `* Re: Problèmes bizarres de lecture dans un pipe (en C).3Olivier Miakinen
14 Dec 22 i   `* Re: Problèmes bizarres de lecture dans un pipe (en C).2Nicolas George
14 Dec 22 i    `- Re: Problèmes bizarres de lecture dans un pipe (en C).1Olivier Miakinen
19 Dec 22 `- Bonne nouvelle (was: Problèmes bizarres de lecture dans un pipe (en C).)1Olivier Miakinen

Haut de la page

Les messages affichés proviennent d'usenet.

NewsPortal