system(3) Library Functions Manual system(3) NOM system - Executer une commande d'interpreteur BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include int system(const char *commande); DESCRIPTION La fonction de bibliotheque system() se comporte comme si elle utilisait fork(2) pour creer un processus enfant qui executerait la commande d'interpreteur indiquee dans commande en utilisant execl(3) comme ceci : execl("/bin/sh", "sh", "-c", commande, (char *) NULL); system() se termine apres l'execution de la commande. Lors de l'execution de la commande, SIGCHLD sera bloque, et SIGINT et SIGQUIT seront ignores dans le processus qui appelle system() (ces signaux seront traites conformement a leurs valeurs par defaut dans le processus enfant qui execute commande). Si la valeur de commande est NULL, system() renvoie un etat indiquant si un interpreteur de commande est disponible sur le systeme. VALEUR RENVOYEE La valeur renvoyee par system() est une des suivantes : - Si commande est NULL, alors une valeur differente de zero est renvoyee si un interpreteur de commandes est accessible, et 0 sinon. - Si un processus enfant n'a pas pu etre cree ou si son etat n'a pas pu etre recupere, la valeur renvoyee est -1 et errno est definie pour indiquer l'erreur. - Si un interpreteur n'a pas pu s'executer dans le processus enfant, alors la valeur renvoyee est comme si l'interpreteur enfant s'etait termine en appelant _exit(2) avec l'etat 127. - Si tous les appels systeme reussissent, alors la valeur renvoyee est l'etat de retour de l'interpreteur enfant utilise pour executer commande (l'etat final d'un interpreteur est l'etat final de la derniere commande qu'il execute). Dans les deux derniers cas, la valeur renvoyee est un << etat d'attente >> qui peut etre examine en utilisant les macros decrites dans waitpid(2) (c'est-a-dire WIFEXITED(), WEXITSTATUS(), etc.). system() n'affecte pas l'etat d'attente des autres processus enfants. ERREURS system() peut echouer avec une des erreurs decrites pour fork(2). ATTRIBUTS Pour une explication des termes utilises dans cette section, consulter attributes(7). +---------------------------------+--------------------------+---------+ |Interface | Attribut | Valeur | +---------------------------------+--------------------------+---------+ |system() | Securite des threads | MT-Safe | +---------------------------------+--------------------------+---------+ STANDARDS C11, POSIX.1-2008. HISTORIQUE POSIX.1-2001, C89. NOTES system() fournit simplicite et commodite : elle gere tous les details des appels de fork(2), execl(3) et waitpid(2), ainsi que les manipulations necessaires des signaux ; de plus, l'interpreteur de commande realise les substitutions habituelles et les redirections des entrees et sorties de commande. L'inconvenient principal de system() est son manque d'efficacite : des appels systeme supplementaires sont necessaires pour creer le processus qui execute l'interpreteur de commande et pour executer l'interpreteur de commande. Si la macro de test de fonctionnalite _XOPEN_SOURCE est definie (avant d'inclure tout fichier d'en-tete), les macros decrites dans waitpid(2) (WEXITSTATUS(), etc.) sont disponibles en incluant . Comme mentionne plus haut, system() ignore SIGINT et SIGQUIT. Un programme qui l'appelle depuis une boucle risque de ne pas pouvoir etre interrompu, a moins qu'il ne verifie 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 precise si les gestionnaires enregistres a l'aide de pthread_atfork(3) sont appeles au cours de l'execution de system(). Dans l'implementation de la glibc, de tels gestionnaires ne sont pas appeles. Avant la glibc 2.1.3, la verification de la disponibilite de /bin/sh n'etait pas reellement executee lorsque commande etait NULL. Il etait suppose etre toujours disponible, et system() renvoyait toujours 1 dans ce cas. Depuis la glibc 2.1.3, cette verification est effectuee, car, meme si POSIX.1-2001 impose une implementation conforme pour fournir un interpreteur, cet interpreteur peut ne pas etre disponible ou executable si le programme appelant a auparavant appele chroot(2) (ce qui n'est pas specifie dans POSIX.1-2001). La commande d'interpreteur peut se terminer avec un etat de 127, ce qui provoque une valeur renvoyee de system() non distinguable du cas ou un interpreteur n'a pas pu etre execute dans le processus enfant. Mises en garde N'utilisez pas system() a partir d'un programme avec privileges (un programme set-user-ID, set-group-ID ou possedant des capacites), car des valeurs particulieres de certaines variables d'environnement pourraient etre utilisees pour corrompre l'integrite du systeme. Par exemple, PATH pourrait etre redefinie de facon a executer un programme arbitraire avec privileges. Utilisez plutot la famille de fonctions exec(3), mais pas execlp(3) ou execvp(3) (qui utilisent aussi la variable d'environnement PATH pour rechercher un executable). En fait, system() ne fonctionnera pas correctement a partir de programmes ayant des privileges set-user-ID ou set-group-ID sur les systemes ou /bin/sh redirige vers bash version 2, car ce dernier annule les privileges au demarrage par mesure de securite (Debian utilise un interpreteur de commande different, dash(1), qui n'effectue pas cette annulation de privileges si on l'invoque a l'aide du lien symbolique sh). Toute entree utilisateur qui constitue une partie de commande doit etre nettoyee avec soin afin de s'assurer que des commandes de l'interpreteur ou des options de commandes inattendues ne seront pas executees. Les risques de ce type sont particulierement graves lorsqu'on utilise system() a partir d'un programme avec privileges. BOGUES Si le nom de la commande commence par un trait d'union, sh(1) interprete ce nom comme une option et le resultat est indetermine (voir l'option -c de sh(1)). Pour contourner ce probleme, prefixez le nom de la commande avec une espace comme dans l'appel suivant : system(" -nom-de-commande-problematique"); VOIR AUSSI sh(1), execve(2), fork(2), sigaction(2), sigprocmask(2), wait(2), exec(3), signal(7) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot et Lucien Gentis Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 system(3)