SYSTEM(3) Manuel du programmeur Linux SYSTEM(3)
system - Excuter une commande shell
#include <stdlib.h>
int system(const char *commande);
La fonction system() excute la commande indique dans commande en
appelant /bin/sh -c commande, et revient aprs l'excution complte de la
commande. Durant cette excution, le signal SIGCHLD est bloqu, et les
signaux SIGINT et SIGQUIT sont ignors.
La valeur renvoye est -1 en cas d'erreur (par exemple chec de fork(2))
ou le code de retour de la commande en cas de succs. Ce dernier code
est dans le format indiqu dans wait(2). Ainsi, le retour de la commande
sera WEXITSTATUS(status). Dans le cas o /bin/sh ne peut pas tre excut,
le code de retour sera identique celui d'une commande effectuant un
exit(127).
Si la valeur de commande est NULL, system() renvoie une valeur non
nulle si le shell est accessible, et zro sinon.
system() n'affecte pas le statut d'attente des autres processus fils.
C89, C99, POSIX.1-2001.
Si la macro de test de fonctionnalit _XOPEN_SOURCE est dfinie, les
macros dcrites dans wait(2) (WEXITSTATUS(), etc.) sont disponibles en
incluant <stdlib.h>.
Comme mentionn plus haut, system() ignore SIGINT et SIGQUIT. Un pro-
gramme qui l'appelle en boucle risque de ne pas pouvoir tre interrompu,
moins qu'il ne vrifie le code de retour du fils, par exemple
while (qqchose) {
int ret = system("foo");
if (WIFSIGNALED(ret) &&
(WTERMSIG(ret) == SIGINT || WTERMSIG(ret) == SIGQUIT))
break;
}
N'utilisez jamais system() dans un programme avec les privilges Set-UID
ou Set-GID. Des variables d'environnement avec des valeurs tranges peu-
vent tre utilises pour corrompre l'intgrit du systme. Utilisez les
fonctions 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 privilges fournis par les bits Set-UID ou Set-GID sur
les systmes o /bin/sh est bash version 2, car celui-ci rejette les
privilges au dmarrage (Debian utilise une version modifie de bash o ce
comportement est abandonn si on l'invoque sous le nom sh).
Avec les versions de la glibc antrieures 2.1.3, la vrification de la
disponibilit de /bin/sh n'tait pas faite lorsque command tait NULL. Il
tait toujours suppos tre disponible, et system() renvoyait toujours 1
dans ce cas. Depuis glibc 2.1.3, cette vrification est effectue, car,
mme si POSIX.1-2001 impose aux implmentations conformes de fournir un
shell, ce shell peut ne pas tre oprationnel si le programme appelant a
auparavant appel chroot(2) (ce qui n'est pas spcifi dans POSIX.1-2001).
Il est possible qu'une commande shell renvoie 127, ainsi le code de
retour n'est pas une indication sre de l'chec de execve(2).
Si la macro de test de fonctionnalit _XOPEN_SOURCE est dfinie, les
macros dcrites dans wait(2) (WEXITSTATUS(), etc.) sont disponibles en
incluant <stdlib.h>.
sh(1), signal(2), wait(2), exec(3)
Cette page fait partie de la publication 3.07 du projet man-pages
Linux. Une description du projet et des instructions pour signaler des
anomalies peuvent tre trouves l'adresse http://www.ker-
nel.org/doc/man-pages/.
Cette page de manuel a t traduite et mise jour par Christophe Blaess
<http://www.blaess.fr/christophe/> entre 1996 et 2003, puis par Alain
Portal <aportal AT univ-montp2 DOT fr> jusqu'en 2006, et mise disposi-
tion sur http://manpagesfr.free.fr/.
Les mises jour et corrections de la version prsente dans Debian sont
directement gres par Nicolas Franois <nicolas.francois [AT] centraliens.net>
et l'quipe francophone de traduction de Debian.
Veuillez signaler toute erreur de traduction en crivant
<debian-l10n-french [AT] lists.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir accs la version anglaise de ce document en
utilisant la commande man -L C <section> <page_de_man> .
20 dcembre 2004 SYSTEM(3)