OVH Cloud OVH Cloud

Création d'un fichier FIFO

1 réponse
Avatar
Sebastien
Bonjour,
Dans un script je réalise l'envoi de données au travers d'un fichier fifo.
Pour ça je crée le fichier :

mknod FICHIER p

Puis je l'utilise (avec gzip en l'occurence ) :

gzip < p > Sortie &

A la fin de mon script je voudrais arreter gzip : comment procéder ? On m'a
indiqué la démarche suivante :

gzip < p > Sortie &
PROCID=echo $!

# SCRIPT

rm -f p
kill $PROCID

Or, il s'avere que mon kill ne supprime pas toujours le gzip, et je peux
avoir ce gizp qui continue. Pourquoi ? Ma démarche est-elle erronnée ?

Sébastien

1 réponse

Avatar
Stephane CHAZELAS
Le Mon, 6 Oct 2003 11:55:57 +0200, Sebastien écrivait :
Dans un script je réalise l'envoi de données au travers d'un fichier fifo.
Pour ça je crée le fichier :

mknod FICHIER p


Utilise plutot "mkfifo FICHIER"

Puis je l'utilise (avec gzip en l'occurence ) :

gzip < p > Sortie &

A la fin de mon script je voudrais arreter gzip : comment procéder ?
[...]


Normalement, gzip devrait s'arreter automatiquement quand
l'autre processus en face a fermé l'autre bout du pipe.

En fait, ce qui se passe dans « gzip < p > Sortie » :

le shell se forke et dans le fils ouvre "p" en lecture. Ce
"open" est bloqué jusqu'à ce qu'un processus en face ouvre "p"
en écriture. Ensuite le shell "exec"e gzip qui fait des "read"
sur le file descriptor correspondant à "p". Si le pipe est vide
"read" bloque, mais s'il est vide et qu'il n'y a plus un
processus en face, alors le read renvoie 0 indiquant à gzip une
fin de fichier.

C'est le comportement standard, voir à

http://www.opengroup.org/onlinepubs/007904975/functions/open.html
http://www.opengroup.org/onlinepubs/007904975/functions/read.html

Exemple de mise en évidence:

$ gzip < p > p.gz &
[1] 242
$ exec 3> p
$ echo test >&3
$ echo test2 >&3
$ exec 3>&-
$
[1] + done gzip < p > p.gz

--
Stéphane