SYSTEM(3)

NOM
system - Exécuter une commande shell

SYNOPSIS
#include <stdlib.h>

int system(const char *command);

DESCRIPTION
La fonction de bibliothèque system() utilise fork(2) pour créer un processus fils qui exécute la commande d’interpréteur indiquée dans command en utilisant execl(3) comme ceci :
    execl("/bin/sh", "sh". "-c", command, (char *) 0); system() se termine après l’exécution de la commande. Lors de l’exécution de la commande, SIGCHLD sera bloqué, et SIGINT et SIGQUIT seront ignorés, dans le processus qui appelle system() (ces signaux seront traités conformément à leurs valeurs par défaut dans le processus fils qui exécute command). Si la valeur de command est NULL, system() renvoie une valeur non nulle si l’interpréteur de commandes est disponible sur le système.

VALEUR RENVOYÉE
La valeur de retour de system() est une des suivantes.

*   Si command est NULL, alors une valeur non nulle est renvoyée si un interpréteur de commandes est accessible, et zéro sinon.

*   Si un processus fils n’a pas pu être créé ou si l’état n’a pas pu être récupéré, la valeur de retour est -1.

*   Si un interpréteur n’a pas pu s’exécuter dans le processus fils, alors la valeur de retour est comme si l’interpréteur fils s’était terminé en appelant _exit(2) avec l’état 127.

*   Si tous les appels système réussissent, alors la valeur de retour est l’état de retour de l’interpréteur fils utilisé pour exécuter command (l’état de retour d’un interpréteur est l’état de retour de la dernière commande qu’il exécute).

Dans les deux derniers cas, la valeur de retour est un « état d’attente » qui peut être examiné en utilisant les macros décrites dans waitpid(2) (c’est-à-dire WIFEXITED(), WEXITSTATUS(), etc.)

system() n'affecte pas l'état d'attente des autres processus fils.

ATTRIBUTS

  Multithreading (consultez pthreads(7))
La fonction system() est sûre dans un contexte multithread.

CONFORMITÉ
C89, C99, POSIX.1-2001.

NOTES
system() fournit de la facilité et de la commodité : elle s’occupe de tous les détails d’appel de fork(2), execl(3) et waitpid(2), ainsi que des manipulations nécessaires des signaux ; de plus, l’interpréteur réalise les substitutions habituelles et les redirections d’entrées et sorties pour command. Le coût principal de system() est l’inefficacité : des appels système supplémentaires sont nécessaires pour créer le processus qui exécute l’interpréteur et pour exécuter l’interpréteur. 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 waitpid(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).

La commande d’interpréteur peut se terminer avec un état de 127, ce qui envoie une valeur de retour de system() non distinguable du cas où un interpréteur n’a pas pu être exécuté dans le processus fils.

VOIR AUSSI
sh(1), sigaction(2), sigprocmask(2), fork(2), wait(2), exec(3), signal(7)

COLOPHON
Cette page fait partie de la publication 3.70 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 à <perkamon-fr@traduc.org>.

Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « LC_ALL=C man <section> <page_de_man> ».