NOM¶
system - Exécuter une commande shell
SYNOPSIS¶
#include <stdlib.h>
int system(const char *command);
DESCRIPTION¶
La fonction
system() exécute la commande indiquée dans
command en appelant
/bin/sh -c command, et revient
après l'exécution complète 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 -1 en cas d'erreur (par exemple échec de
fork(2)) ou le code de retour de la commande en cas de succès. 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 exécuté, le code de retour sera
identique à celui d'une commande effectuant un
exit(127).
Si la valeur de
command est NULL,
system() renvoie une valeur non
nulle si le shell est accessible, et zéro sinon.
system() n'affecte pas l'état d'attente des autres processus fils.
C89, C99, POSIX.1-2001.
NOTES¶
Si la macro de test de fonctionnalité
_XOPEN_SOURCE est définie
(avant d'inclure
tout fichier d'en‐tête), les macros
décrites dans
wait(2) (
WEXITSTATUS(), etc.) sont
disponibles en incluant
<stdlib.h>.
Comme mentionné plus haut,
system() ignore
SIGINT et
SIGQUIT. Un programme qui l'appelle en boucle risque de ne pas pouvoir
être interrompu, à moins qu'il ne vérifie 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 privilèges
Set-UID ou Set-GID. Des variables d'environnement avec des valeurs
étranges peuvent être utilisées pour corrompre
l'intégrité du système. Utilisez les fonctions de la famille
exec(3) à la place, mais pas
execlp(3) ni
execvp(3).
system() ne fonctionnera pas correctement avec les programmes 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).
Avec les versions de la glibc antérieures à 2.1.3, la
vérification 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 vérification est effectuée,
car, même si POSIX.1-2001 impose aux implémentations conformes de
fournir un shell, ce shell peut ne pas être opérationnel si le
programme appelant a auparavant appelé
chroot(2) (ce qui n'est pas
spécifié dans POSIX.1-2001).
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(2).
VOIR AUSSI¶
sh(1),
signal(2),
wait(2),
exec(3)
COLOPHON¶
Cette page fait partie de la publication 3.44 du projet
man-pages Linux.
Une description du projet et des instructions pour signaler des anomalies
peuvent être trouvées à l'adresse
<
http://www.kernel.org/doc/man-pages/>.
TRADUCTION¶
Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a
<
http://po4a.alioth.debian.org/> par l'équipe de traduction
francophone au sein du projet perkamon
<
http://perkamon.alioth.debian.org/>.
Christophe Blaess <
http://www.blaess.fr/christophe/> (1996-2003), Alain
Portal <
http://manpagesfr.free.fr/> (2003-2006). Nicolas François
et l'équipe francophone de traduction de Debian (2006-2009).
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet
manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document
en utilisant la commande «
man -L C
<section> <page_de_man> ».