SYSTEM(3) Manuel du programmeur Linux SYSTEM(3)
NOM
system - Exécuter une commande Shell.
SYNOPSIS
#include <stdlib.h>
int system (const char * string);
DESCRIPTION
La fonction system() exécute la commande indiquée dans
string en appelant /bin/sh -c string, et revient après
l'exécution complete de la commande. Durant cette
exécution, le signal SIGCHLD est bloqué, et les signaux
SIGINT et SIGQUIT sont ignorés.
VALEUR RENVOYÉE
La valeur renvoyée est 127 si l'appel système execve()
pour /bin/sh échoue, -1 si une autre erreur se produit, ou
le code de retour de la commande sinon.
Si la valeur de string est NULL, system() renvoie une
valeur non nulle si le shell est accessible, et zéro
sinon.
system() n'affecte pas le statut d'attente des autres pro
cessus fils.
CONFORMITÉ
ANSI C, POSIX.2, BSD 4.3
BUGS
Il est vraiment dommage que la version libc de system()
ignore les interruptions. Un programme qui l'appelle en
boucle devient ininterruptible. Dans certains cas il faut
donc éviter d'utiliser system(), mais créer plutot sa pro
pre version, dans le genre : (attention ! code non-testé)
int
my_system (const char * commande)
{
pid_t pid;
int status;
if (commande == 0)
return (1);
if ((pid = fork ()) < 0)
return (-1);
if (pid == 0) {
char * argv [4];
argv [0] = "sh";
GNU 14 Décembre 1998 1
SYSTEM(3) Manuel du programmeur Linux SYSTEM(3)
argv [1] = "-c";
argv [2] = commande;
argv [3] = 0;
execve ("/bin/sh", argv, environ);
exit (127);
}
while (1) {
if (waitpid (pid, & status, 0) == -1) {
if (errno != EINTR)
return (-1);
} else {
return (status);
}
}
}
N'utilisez jamais system() dans un programme avec les
privilèges Set-UID ou Set-GID. Des variables d'environ
nement avec des valeurs étranges peuvent être utilisées
pour corrompre l'intégrité du système. Utilisez les fonc
tions de la famille exec(3) à la place, mais pas execlp(3)
ni execvp(3).
system() ne fonctionnera pas correctement avec les pro
grammes ayant des privilèges fournis par les bits Set-UID
ou Set-GID sur les systèmes où /bin/sh est bash version 2,
car celui-ci rejette les privilèges au démarrage. (Debian
utilise une version modifiée de bash où ce comportement
est abandonné si on l'invoque sous le nom sh).
La vérification de disponibilité du shell /bin/sh n'est
pas réellement faite. Il est toujours supposé disponible.
Le standard ISO C réclame cette vérification, mais POSIX.2
précise que le retour doit toujours être non-nul car un
système sans shell n'est pas conforme. Ceci justifie le
choix d'implémentation.
Il est possible qu'une commande shell renvoie 127, ainsi
le code de retour n'est pas une indication sûre de l'échec
de execve(). Verifiez errno pour en être sûrs.
VOIR AUSSI
sh(1), signal(2), exec(3)
TRADUCTION
Christophe Blaess, 1997.
GNU 14 Décembre 1998 2