Provided by: manpages-fr-dev_4.21.0-2_all bug

NOM

       system - Exécuter une commande d'interpréteur

BIBLIOTHÈQUE

       Bibliothèque C standard (libc, -lc)

SYNOPSIS

       #include <stdlib.h>

       int system(const char *commande);

DESCRIPTION

       La  fonction de bibliothèque system() se comporte comme si elle utilisait fork(2) pour créer un processus
       enfant qui exécuterait la commande d’interpréteur indiquée dans  commande  en  utilisant  execl(3)  comme
       ceci :

           execl("/bin/sh", "sh", "-c", commande, (char *) NULL);

       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 enfant qui exécute commande).

       Si  la valeur de commande est NULL, system() renvoie un état indiquant si un interpréteur de commande est
       disponible sur le système.

VALEUR RENVOYÉE

       La valeur renvoyée par system() est une des suivantes :

       -  Si commande est NULL, alors une valeur différente de zéro est renvoyée si un interpréteur de commandes
          est accessible, et 0 sinon.

       -  Si un processus enfant n’a pas pu être créé ou si son  état  n’a  pas  pu  être  récupéré,  la  valeur
          renvoyée est -1 et errno est définie pour indiquer l'erreur.

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

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

       Dans les deux derniers cas, la valeur renvoyée 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 enfants.

ERREURS

       system() peut échouer avec une des erreurs décrites pour fork(2).

ATTRIBUTS

       Pour une explication des termes utilisés dans cette section, consulter attributes(7).
       ┌──────────────────────────────────────────────────────────────────────┬──────────────────────┬─────────┐
       │ InterfaceAttributValeur  │
       ├──────────────────────────────────────────────────────────────────────┼──────────────────────┼─────────┤
       │ system()                                                             │ Sécurité des threads │ MT-Safe │
       └──────────────────────────────────────────────────────────────────────┴──────────────────────┴─────────┘

STANDARDS

       POSIX.1-2001, POSIX.1-2008, C99.

NOTES

       system()  fournit simplicité et commodité : elle gère tous les détails des appels de fork(2), execl(3) et
       waitpid(2), ainsi que les manipulations nécessaires des signaux ; de  plus,  l’interpréteur  de  commande
       réalise  les substitutions habituelles et les redirections des entrées et sorties de commande. L'inconvé‐
       nient principal de system() est son manque d'efficacité : des appels système supplémentaires sont  néces‐
       saires  pour créer le processus qui exécute l’interpréteur de commande et pour exécuter l’interpréteur de
       commande.

       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  depuis  une
       boucle  risque de ne pas pouvoir être interrompu, à moins qu'il ne vérifie le code de retour de l'enfant.
       Par exemple :

           while (quelque_chose) {
               int ret = system("toto");

               if (WIFSIGNALED(ret) &&
                   (WTERMSIG(ret) == SIGINT || WTERMSIG(ret) == SIGQUIT))
                       break;
           }

       Selon POSIX.1, il n'est pas précisé si les gestionnaires enregistrés à l'aide de  pthread_atfork(3)  sont
       appelés  au cours de l'exécution de system(). Dans l'implémentation de la glibc, de tels gestionnaires ne
       sont pas appelés.

       Avant la glibc 2.1.3, la vérification de la disponibilité de  /bin/sh  n'était  pas  réellement  exécutée
       lorsque  commande était NULL. Il était supposé être toujours disponible, et system() renvoyait toujours 1
       dans ce cas. Depuis la glibc 2.1.3, cette vérification est effectuée, car, même  si  POSIX.1-2001  impose
       une implémentation conforme pour fournir un interpréteur, cet interpréteur peut ne pas être disponible ou
       exécutable  si  le  programme  appelant a auparavant appelé chroot(2) (ce qui n'est pas spécifié dans PO‐
       SIX.1-2001).

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

   Mises en garde
       N'utilisez  pas  system() à partir d'un programme avec privilèges (un programme set-user-ID, set-group-ID
       ou possédant des capacités), car des valeurs particulières de certaines variables  d'environnement  pour‐
       raient être utilisées pour corrompre l'intégrité du système. Par exemple, PATH pourrait être redéfinie de
       façon  à  exécuter  un  programme  arbitraire  avec  privilèges.  Utilisez plutôt la famille de fonctions
       exec(3), mais pas execlp(3) ou execvp(3) (qui utilisent aussi la variable d'environnement PATH  pour  re‐
       chercher un exécutable).

       En  fait,  system()  ne  fonctionnera  pas  correctement  à  partir  de  programmes  ayant des privilèges
       set-user-ID ou set-group-ID sur les systèmes où /bin/sh redirige vers bash version 2, car ce dernier  an‐
       nule  les privilèges au démarrage par mesure de sécurité (Debian utilise un interpréteur de commande dif‐
       férent, dash(1), qui n'effectue pas cette annulation de privilèges si on l'invoque à l'aide du lien  sym‐
       bolique sh).

       Toute  entrée utilisateur qui constitue une partie de commande doit être nettoyée avec soin afin de s'as‐
       surer que des commandes de l'interpréteur ou des options de commandes inattendues ne  seront  pas  exécu‐
       tées.  Les  risques de ce type sont particulièrement graves lorsqu'on utilise system() à partir d'un pro‐
       gramme avec privilèges.

BOGUES

       Si le nom de la commande commence par un trait d'union, sh(1) interprète ce nom comme une  option  et  le
       résultat  est indéterminé (voir l'option -c de sh(1)). Pour contourner ce problème, préfixez le nom de la
       commande avec une espace comme dans l'appel suivant :

               system(" -nom-de-commande-problématique");

VOIR AUSSI

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

TRADUCTION

       La  traduction  française   de   cette   page   de   manuel   a   été   créée   par   Christophe   Blaess
       <https://www.blaess.fr/christophe/>,  Stéphan  Rafin  <stephan.rafin@laposte.net>,  Thierry Vignaud <tvi‐
       gnaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe  Guérard  <fe‐
       vrier@tigreraye.org>,  Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@de‐
       bian.org>,  Thomas  Huriaux  <thomas.huriaux@gmail.com>,   Nicolas   François   <nicolas.francois@centra‐
       liens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>,
       Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Lucien Gentis <lucien.gentis@wai‐
       ka9.com>

       Cette  traduction  est  une  documentation libre ; veuillez vous reporter à la GNU General Public License
       version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.

       Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à  de‐
       bian-l10n-french@lists.debian.org.

Pages du manuel de Linux 6.03                    5 février 2023                                        system(3)