POPEN(3) Manuel du programmeur Linux POPEN(3)
NOM
popen, pclose - Entrées/Sorties pour un processus.
SYNOPSIS
#include <stdio.h>
FILE *popen (const char *commande, const char *type);
int pclose (FILE *stream);
DESCRIPTION
La fonction popen() engendre un processus en créant un
tube (pipe), exécutant un fork(), et en invoquant le
shell. Comme un tube est unidirectionnel par définition,
l'argument type doit indiquer seulement une lecture ou une
écriture, et non pas les deux. Le flux correspondant sera
ouvert en lecture seule ou écriture seule.
L'argument commande est un pointeur sur une chaîne de car
actères, terminée par un caractère nul, et contenant une
ligne de commande shell. Cette commande est transmise à
/bin/sh en utilisant l'option -c. L'interprétation en est
laissée au shell.
L'argument mode est un pointeur sur une chaîne de car
actères, terminée par un caractère nul, qui doit contenir
à 'r' pour la lecture ou 'w' pour l'écriture.
La valeur renvoyée par popen() est un flux d'entrée/sortie
normal, à la seule différence qu'il doit être fermé en
appelant pclose() à la place de fclose(). L'écriture dans
le flux correspond à écrire sur l'entrée standard de la
commande. Le flux de sortie standard de la commande est le
même que celui du processus appelant popen(), à moins que
la commande le modifie. Symétriquement, la lecture depuis
un flux ouvert par popen() correspond à lire la sortie
standard de la commande, et dans ce cas l'entrée standard
de la commande est la même que celle du processus appelant
popen.
Notez que, par défaut, les flux de sortie fournis par
popen disposent d'un buffer.
La fonction pclose attend que le processus correspondant
se termine, et renvoie alors le statut de sortie de la
commande, comme en utilisant wait4.
VALEUR RENVOYÉE
La fonction popen renvoie NULL si l'appel système fork(2)
ou pipe(2) échoue, ou s'il n'a pas assez de mémoire.
La fonction pclose renvoie -1 si wait4 échoue, ou si une
autre erreur est détectée.
BSD 14 Décembre 1998 1
POPEN(3) Manuel du programmeur Linux POPEN(3)
ERREURS
La fonction popen ne remplit pas errno si une allocation
mémoire échoue. Si les appels fork() ou pipe() sous-
jacents échouent, errno est correctement rempli. Si
l'argument mode est invalide, et si cette condition est
détectée, errno contient EINVAL.
Si pclose() n'arrive pas à obtenir le status du fils,
errno contient ECHILD.
CONFORMITÉ
POSIX.2
BUGS
Comme l'entrée standard d'une commande ouverte en lecture
partage son pointeur de position dans le flux avec le pro
cessus appelant popen(), si le processus original a
effectué des lectures en buffer, la position du flux
d'entrée de la commande peut être différente de celle
attendue. Symétriquement, la sortie d'une commande
ouverte en écriture peut s'emmêler avec celle du processus
original. Le second problème peut être évité en appelant
fflush(3) avant popen.
Il n'est pas possible de distinguer un échec d'exécution
du shell lui-même, d'un échec d'exécution d'une commande
par le shell, ni même d'une sortie immédiate de la com
mande. Le seul indice est un code de retour de 127.
HISTORIQUE
Des fonctions popen() et pclose() sont apparues dans la
Version 7 d'AT&T UNIX.
VOIR AUSSI
fork(2), sh(1), pipe(2), wait4(2), fflush(3), fclose(3),
fopen(3), stdio(3), system(3).
TRADUCTION
Christophe Blaess, 1997.
BSD 14 Décembre 1998 2