Man page - system(3)

Packages contains this manual

Available languages:

en fr tr ja ru ro de

Manual

system

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
ATTRIBUTS
STANDARDS
HISTORIQUE
NOTES
Avertissements
BOGUES
VOIR AUSSI
TRADUCTION

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).

Image grohtml-3896779-1.png

STANDARDS

C11, POSIX.1-2008.

HISTORIQUE

POSIX.1-2001, C89.

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.

Avertissements

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 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 .