(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> )
Salut a tous,fait man system (voir ci-dessous), un code source est fourniDites sytem(...) dans un code C c'est mal comme on dirait dans South Park
mais qu'elle est la meilleure solution
de remplacement ?
$ 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 |
Systèmes & Réseaux |
|
|