SYSTEM(3)          Manuel du programmeur Linux          SYSTEM(3)


NOM
       system - Exécuter une commande Shell.

SYNOPSIS
       #include <stdlib.h>

       int system (const char * string);

DESCRIPTION
       La  fonction  system()  exécute  la commande indiquée dans
       string en appelant /bin/sh -c  string,  et  revient  après
       l'exécution   complete   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  127 si l'appel système execve()
       pour /bin/sh échoue, -1 si une autre erreur se produit, ou
       le code de retour de la commande sinon.

       Si  la  valeur  de  string  est NULL, system() renvoie une
       valeur non nulle si  le  shell  est  accessible,  et  zéro
       sinon.

       system() n'affecte pas le statut d'attente des autres pro­
       cessus fils.

CONFORMITÉ
       ANSI C, POSIX.2, BSD 4.3

BUGS
       Il est vraiment dommage que la version  libc  de  system()
       ignore  les  interruptions.  Un programme qui l'appelle en
       boucle devient ininterruptible. Dans certains cas il  faut
       donc éviter d'utiliser system(), mais créer plutot sa pro­
       pre version, dans le genre : (attention ! code non-testé)

            int
       my_system (const char * commande)
       {
           pid_t pid;
           int   status;

           if (commande == 0)
               return (1);

           if ((pid = fork ()) < 0)
               return (-1);

           if (pid == 0) {

               char * argv [4];

               argv [0] = "sh";



GNU                      14 Décembre 1998                       1





SYSTEM(3)          Manuel du programmeur Linux          SYSTEM(3)


               argv [1] = "-c";
               argv [2] = commande;
               argv [3] = 0;
               execve ("/bin/sh", argv, environ);
               exit (127);
           }

           while (1) {

               if (waitpid (pid, & status, 0) == -1) {

                   if (errno != EINTR)
                       return (-1);
               } else {
                   return (status);
               }
           }
       }


       N'utilisez jamais system()  dans  un  programme  avec  les
       privilèges  Set-UID  ou  Set-GID. Des variables d'environ­
       nement avec des valeurs étranges  peuvent  être  utilisées
       pour corrompre l'intégrité du système.  Utilisez les fonc­
       tions 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 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).

       La vérification de disponibilité du  shell  /bin/sh  n'est
       pas  réellement faite. Il est toujours supposé disponible.
       Le standard ISO C réclame cette vérification, mais POSIX.2
       précise  que  le  retour doit toujours être non-nul car un
       système sans shell n'est pas conforme.  Ceci  justifie  le
       choix d'implémentation.

       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().  Verifiez errno pour en être sûrs.

VOIR AUSSI
       sh(1), signal(2), exec(3)


TRADUCTION
       Christophe Blaess, 1997.






GNU                      14 Décembre 1998                       2