(Courriels de diversion: <insinuons@rivalise-alarmeront.com> <donnaient@assouvisses-electivite.com> <pliures@inviolees-hommes-grenouilles.com> <reactualisions@saignerez-impetueuse.com> <amants@fraudent-avaient.com> <entrouvrirais@bouledogue-rabâcheuses.com> <desserrons@urbaine-pesterai.com> <algarade@interrogeaient-repandrait.com> <poinconnent@deballerais-detrone.com> <dorlote@cacheriez-derangerez.com> )


Fabrice BACOU wrote:
Salut a tous,

    Dites sytem(...) dans un code C c'est mal comme on dirait dans South Park
mais qu'elle est la meilleure solution
de remplacement ?
 

fait man system (voir ci-dessous), un code source est fourni

$ man system
SYSTEM(3)          Manuel du programmeur Linux          SYSTEM(3)

NOM
       system - Executer une commande Shell.

SYNOPSIS
       #include <stdlib.h>

       int system (const char * string);

DESCRIPTION
       La  fonction  system()  execute  la commande indiquee dans
       string en appelant /bin/sh -c  string,  et  revient  apres
       l'execution  complete de la commande.  Durant cette execu­
       tion, le signal SIGCHLD est bloque, et les signaux  SIGINT
       et SIGQUIT sont ignores.

VALEUR RENVOYEE
       La  valeur  renvoyee  est  127 si l'appel systeme execve()
       pour /bin/sh echoue, -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  zero
       sinon.

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

CONFORME A
       ANSI C, POSIX.1, proposition 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 eviter d'utiliser system(), mais creer plutot sa pro­
       pre version, dans le genre : (attention ! code non-teste)
 

       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";
              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
       privileges  Set-UID  ou  Set-GID. Des variables d'environ­
       nement avec des valeurs etranges  peuvent  etre  utilisees
      pour corrompre l'integrite du systeme.  Utilisez les fonc­
       tions de la famille exec(3) a la place, mais pas execlp(3)
       ni execvp(3).

       La  verification  de  disponibilite du shell /bin/sh n'est
       pas reellement faite. Il est toujours suppose  disponible.

       Il  est  possible qu'une commande shell renvoie 127, ainsi
       le code de retour n'est pas une indication sure de l'echec
       de execve().  Verifiez errno pour en etre surs.

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

Je te recommande sur ce sujet :

    Programmation Linux 2.0 API Systeme et fonctionnement du noyau
    Auteurs : Eric Dumas, Remis Card, Franck Mevel
    Edition Eyrolles

--

David HUBERSON

http://www.chez.com/huberson
http://huberson.citeweb.net

Tel : 06.xx.xx.xx.xx 
mail : huberson@chez.com
           huberson@citeweb.net
Technicien Administration
Systèmes & Réseaux 
ICQ : #39228799 
Curriculum Vitae