Provided by: manpages-fr-dev_4.18.1-1_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écessaires 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
       POSIX.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 pourraient ê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  rechercher  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  annule  les  privilèges  au démarrage par mesure de sécurité
       (Debian utilise un interpréteur de commande différent, dash(1), qui n'effectue  pas  cette
       annulation de privilèges si on l'invoque à l'aide du lien symbolique sh).

       Toute entrée utilisateur qui constitue une partie de commande doit être nettoyée avec soin
       afin de s'assurer que  des  commandes  de  l'interpréteur  ou  des  options  de  commandes
       inattendues  ne  seront pas exécutées. Les risques de ce type sont particulièrement graves
       lorsqu'on utilise system() à partir d'un programme 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 <tvignaud@mandriva.com>, François Micaux, Alain  Portal  <aportal@univ-montp2.fr>,
       Jean-Philippe    Guérard   <fevrier@tigreraye.org>,   Jean-Luc   Coulon   (f5ibh)   <jean-
       luc.coulon@wanadoo.fr>,   Julien    Cristau    <jcristau@debian.org>,    Thomas    Huriaux
       <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.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@waika9.com>

       Cette traduction est une documentation libre ; veuillez vous reporter  à  la  GNU  General
       Public   License   version 3  ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩  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 à ⟨debian-l10n-french@lists.debian.org⟩.