gilou a écrit a écrit :
C'est probablement ce qui se passe a mon avis.
Si tu es en Korn Shell,
./ghclient.x > rapport.txt 2>&1
redirigera la sortie de stderr dans stdin qui est redirige dans rapport.txt (l'ordre des redirections est important ici).
A+,
|
Oups... en Korn-Shell la syntaxe "2>&1" ne redirige pas la sortie d'erreur vers stdin mais vers le même flux que stdout.
Ce qui fait qu'on peut faire une opération du genre:
programme1 2>&1 | programme2
et le pipe lit redirige bien stdout du programme1 vers stdin du programme2. La séquence est équivalente à:
mkpipe &3 &4
programme1 1>&3 3>&- 2>&1 &
programme2 0>&4 4>&-
Sinon en général, il n'est pas requis d'utiliser un shell pour faire cette redirection de stdout et stderr du programme1 directement depuis programme2: il suffit que programme2 fasse un fork() pour créer un second processus fils, puis dans le processus fils, qu'il ferme stdout et stderr (qui ont été dupliqués du processus père) et les rouvre en dupliquant stdin (de façon à ce que le fils renvoie les données stdout et stderr vers le même flux que stdin du processus père), puis qu'il ferme stdin du fils ou l'ouvre sur un autre fichier d'entrée si nécessaire, ensuite le processus père peut lire le résultat du processus fils directement depuis son stdin. Le processus fils n'a plus qu'à lancer un exec du programme1.
On peut aussi dans le processus père avant de fait un fork créer un pipe (qui possédera deux handles de flux: un d'entrée, un de sortie) avec mkpipe(). Puis on fork(), ce qui duplique ces deux flux dans le processus fils. Le fils ferme alors le flux de lecture du pipe, et le père ferme le flux d'écriture dans le pipe. Ensuite le fils ferme stdout (handle 1) et stderr (handle 2) et les rouvre en dupliquant le handle d'écriture dans le pipe. Si le programme1 n'a pas besoin de lire depuis stdin on peut laisser stdin dupliqué dans le fils. Mais on peut effectuer la même redirection depuis un autre pipe du père au fils. Ensuite le fils n'a plus qu'à faire un exec() du programme1, et le père (qui exécute programme2) peut lire les données du fils depuis le handle de lecture du pipe qu'il a créé. Si le fils se termine, le pipe sera brisé, et le père en sera averti par un erreur PIPE_BROKEN en lisant dans le pipe qui devait renvoyer la suite des messages de sortie et d'erreur du fils.
[edit]--Message édité par verdy_p--[/edit]