Deutsch   English   Français   Italiano  
<63999974$0$3182$426a74cc@news.free.fr>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!news.mixmin.net!proxad.net!feeder1-2.proxad.net!cleanfeed1-a.proxad.net!nnrp1-1.free.fr!not-for-mail
Newsgroups: fr.comp.os.linux.configuration
From: Nicolas George <nicolas$george@salle-s.org>
Subject: Re: =?iso-8859-1?Q?Probl=E8mes_bizarres_de_lecture_dans_un_pipe_=28en_C=29?=
 =?iso-8859-1?Q?=2E?=
Sender: george@phare.invalid (Nicolas George)
X-Newsreader: Flrn (0.9.20070704)
References: <tnab3h$h7v$1@cabale.usenet-fr.net> <6398c186$0$24817$426a74cc@news.free.fr> <tnagqb$jpi$1@cabale.usenet-fr.net>
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
Content-Type: text/plain; charset=utf-8
Date: 14 Dec 2022 09:37:57 GMT
Lines: 52
Message-ID: <63999974$0$3182$426a74cc@news.free.fr>
Organization: Guest of ProXad - France
NNTP-Posting-Date: 14 Dec 2022 10:37:57 CET
NNTP-Posting-Host: 129.199.129.80
X-Trace: 1671010677 news-3.free.fr 3182 129.199.129.80:46304
X-Complaints-To: abuse@proxad.net
Bytes: 3558

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.