OVH Cloud OVH Cloud

Probleme de fcntl

2 réponses
Avatar
Vincent Lefevre
Bonjour,

Voici mon script Perl (simplifié), appelé "colorize":

#!/usr/bin/env perl

use strict;
use Fcntl qw(F_GETFL F_SETFL O_NONBLOCK);

my $flags = fcntl(STDIN, F_GETFL, 0) or die;

while (!eof STDIN)
{
while (<STDIN>)
{
fcntl(STDIN, F_SETFL, $flags | O_NONBLOCK) or die "$!";
print;
}
fcntl(STDIN, F_SETFL, $flags) or die "$!";
}

Maintenant, depuis mon shell zsh, je fais:

greux:~> exec 2>>(colorize > /dev/tty &)
greux:~> echo blah >&2
blah
Invalid argument at /home/lefevre/bin/colorize line 15, <STDIN> line 1.
greux:~>

Pourquoi cette erreur "Invalid argument" pour le 2e fcntl?

Note: le "exec 2>>(colorize > /dev/tty &)" sert à piper le stderr du
shell dans colorize (et le but de colorize sera de coloriser stderr).

--
Vincent Lefèvre <vincent@vinc17.org> - Web: <http://www.vinc17.org/>
100% validated (X)HTML - Acorn / RISC OS / ARM, free software, YP17,
Championnat International des Jeux Mathématiques et Logiques, etc.
Work: CR INRIA - computer arithmetic / SPACES project at LORIA

2 réponses

Avatar
Benoit Izac
Bonjour,

le 02/07/2004 à 17:56, Vincent Lefevre a écrit
dans le message <20040702154628$ :

Désolé, je n'ai pas la réponse à ton problème. En revanche je me
demande quelle est la différence entre

while (!eof STDIN)


et

while (<STDIN>)


?

--
Benoit Izac

Avatar
Vincent Lefevre
Dans l'article ,
Benoit Izac écrit:

Désolé, je n'ai pas la réponse à ton problème. En revanche je me
demande quelle est la différence entre

while (!eof STDIN)


et

while (<STDIN>)


?


Le deuxième peut être faux pour d'autres raisons que la fermeture
du fichier. En particulier (ce qui est mon cas), si STDIN est
configuré en mode non bloquant et qu'il n'y a rien à lire sur
l'entrée standard à ce moment.

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% validated (X)HTML - Acorn / RISC OS / ARM, free software, YP17,
Championnat International des Jeux Mathématiques et Logiques, etc.
Work: CR INRIA - computer arithmetic / SPACES project at LORIA