Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

probleme avec les fonctions exec...

5 réponses
Avatar
Thierry B
Bonjour,
j'ai un probl=E8me avec un fichier source que j'ai ecrit:

---------------------------------------------------------------------------=
---------
#define _POSIX_SOURCE 1
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <string.h>

int main(int argc, char **argv){
pid_t pid_fils;
int i;

/* Structure pour r=E9cup=E9rer les informations de terminaison des
fils */
struct fils {
int fpid;
int retour;
};

struct fils fils[6];

for (i=3D0; i < 6; i++){
pid_fils =3D fork();
fils[i].fpid =3D pid_fils;

if (pid_fils =3D=3D 0) {
switch (i){
case 0:{
printf("FILS %d va faire un ls -l\n", i+1);
execl("/bin/ls","ls","-l",NULL);
perror("execl");
return 0;
break;
}
case 1:{
printf("FILS %d va faire un ls -l\n", i+1);
execlp("ls","ls","-l",NULL);
perror("execlp");
return 0;
break;
}
case 2:{
printf("FILS %d va faire un echo $PATH\n", i+1);
execle("/bin/echo","echo","$PATH", NULL, NULL);
perror("execle");
return 0;
break;
}
case 3:{
char *tab[3] =3D {"ls", "-l", NULL};
printf("FILS %d va faire un ls -l\n", i+1);
execv("/bin/ls",tab);
perror("execv");
return 0;
break;
}
case 4:{
char *tab[3] =3D {"ls", "-l",NULL};
printf("FILS %d va faire un ls -l\n", i+1);
execvp("ls",tab);
perror("execvp");
return 0;
break;
}
case 5:{
char *tab[3] =3D {"echo","$PATH",NULL};
printf("FILS %d va faire un echo $PATH\n", i+1);
execve("/bin/echo",tab,NULL);
perror("execve");
return 0;
break;
}
}
exit(0);
}
}


/* attente de la terminaison des fils et r=E9cup=E9ration des
informations sur leurs terminaisons */
for (i =3D 0; i < 6; i++){
waitpid(fils[i].fpid, &fils[i].retour, WNOHANG);
}

/* Affichage des informations sur la terminaison des fils */
for (i =3D 0; i < 6; i++){
if ((WIFEXITED(fils[i].retour)) !=3D 0) {
printf("Terminaison du fils %d correcte.\n", i+1);
}
printf("Code de retour du fils %d : %d\n", i+1,
WEXITSTATUS(fils[i].retour));
}
return 0;
}
---------------------------------------------------------------------------=
----------------

Ca me donne ceci:

thierry@debian:~/Master/Posix/Semaine2/Partie2$ ./bin/question2
FILS 1 va faire un ls -l
total 20
drwxr-xr-x 2 thierry thierry 4096 2005-10-15 17:40 bin
drwxr-xr-x 2 thierry thierry 4096 2005-10-15 17:12 include
-rw-r--r-- 1 thierry thierry 469 2005-10-15 17:12 makefile
drwxr-xr-x 2 thierry thierry 4096 2005-10-15 17:40 obj
drwxr-xr-x 2 thierry thierry 4096 2005-10-15 17:40 src
FILS 2 va faire un ls -l
FILS 3 va faire un echo $PATH
$PATH
FILS 4 va faire un ls -l
total 20
drwxr-xr-x 2 thierry thierry 4096 2005-10-15 17:40 bin
drwxr-xr-x 2 thierry thierry 4096 2005-10-15 17:12 include
-rw-r--r-- 1 thierry thierry 469 2005-10-15 17:12 makefile
drwxr-xr-x 2 thierry thierry 4096 2005-10-15 17:40 obj
drwxr-xr-x 2 thierry thierry 4096 2005-10-15 17:40 src
total 20
drwxr-xr-x 2 thierry thierry 4096 2005-10-15 17:40 bin
drwxr-xr-x 2 thierry thierry 4096 2005-10-15 17:12 include
-rw-r--r-- 1 thierry thierry 469 2005-10-15 17:12 makefile
drwxr-xr-x 2 thierry thierry 4096 2005-10-15 17:40 obj
drwxr-xr-x 2 thierry thierry 4096 2005-10-15 17:40 src
FILS 5 va faire un ls -l
FILS 6 va faire un echo $PATH
$PATH
Terminaison du fils 1 correcte.
Code de retour du fils 1 : 0
Terminaison du fils 2 correcte.
Code de retour du fils 2 : 0
Terminaison du fils 3 correcte.
Code de retour du fils 3 : 0
Terminaison du fils 4 correcte.
Code de retour du fils 4 : 0
Code de retour du fils 5 : 136
Terminaison du fils 6 correcte.
Code de retour du fils 6 : 0
thierry@debian:~/Master/Posix/Semaine2/Partie2$ total 20
drwxr-xr-x 2 thierry thierry 4096 2005-10-15 17:40 bin
drwxr-xr-x 2 thierry thierry 4096 2005-10-15 17:12 include
-rw-r--r-- 1 thierry thierry 469 2005-10-15 17:12 makefile
drwxr-xr-x 2 thierry thierry 4096 2005-10-15 17:40 obj
drwxr-xr-x 2 thierry thierry 4096 2005-10-15 17:40 src

thierry@debian:~/Master/Posix/Semaine2/Partie2$

Je remarque que le fils 5 (donc le case 4 ne se termine pas) et aussi
que le fils 3 et 6 (donc case 2 et 5) qui sont cens=E9 faire echo $PATH
affichent $PATH, mais pourtant un "echo $PATH" dans un shell affiche le
contenu de la variable PATH, ce qui n'est pas le cas dans mon
programme.

Merci :-)
A+

5 réponses

Avatar
Harpo
Thierry B wrote:


Je remarque que le fils 5 (donc le case 4 ne se termine pas) et aussi
que le fils 3 et 6 (donc case 2 et 5) qui sont censé faire echo $PATH
affichent $PATH, mais pourtant un "echo $PATH" dans un shell affiche
le contenu de la variable PATH, ce qui n'est pas le cas dans mon
programme.


C'est normal, il faut d'abord que le shell expande $PATH, or tu appelles
un programme '/bin/echo' pas le shell, comment cette variable
pourrait-elle être petre expansée ?
Il faut que tu fasse un exec de ( "/bin/sh", "echo" ), enfin un truc
comme ça, et ne pas faire un exec de echo qui lui n'est oas designé
pour faire l'expansion de variables.

Y'aurait une question sur le C en prime ?

Avatar
Pierre Habouzit
Thierry B wrote:

Je remarque que le fils 5 (donc le case 4 ne se termine pas) et aussi
que le fils 3 et 6 (donc case 2 et 5) qui sont censé faire echo $PATH
affichent $PATH, mais pourtant un "echo $PATH" dans un shell affiche le
contenu de la variable PATH, ce qui n'est pas le cas dans mon
programme.


getenv(3)

$PATH est expansé par le shell, pas par echo. echo ne fait rien d'autre
qu'afficher une chaine prise en argument sur stdout. rien de plus
--
·O· Pierre Habouzit
··O
OOO http://www.madism.org

Avatar
Thierry B
Re,

J'ai essayé comme ceci:
case 5:{
char *tab[3] = {"echo","$PATH",NULL};
char *env[2]= {"PATH=/var", NULL};
printf("FILS %d va faire un echo $PATHn", i+1);
execve("/bin/sh",tab,env);
perror("execve");
return 0;
break;
}

Comme ca je lui définis quand même une variable PATH (c pour un exo
lol sinon c'est sur que ca sert à rien de la défninir comme ca).

Mais ca me donne ca :-(

FILS 6 va faire un echo $PATH
echo: $PATH: No such file or directory

Merci
A+
Avatar
Thierry B
Re,

euh j'avais oublié de demander

Quelqu'un a une idée, du fait qu'à chaque execution, ce n'est pas
forcement les mêmes fils qui se terminent correctement lol.
C'est un peu aléatoire,ce qui n'est pas trop normal je pense...

Merci
A+
Avatar
Harpo
Thierry B wrote:

Re,

euh j'avais oublié de demander

Quelqu'un a une idée, du fait qu'à chaque execution, ce n'est pas
forcement les mêmes fils qui se terminent correctement lol.
C'est un peu aléatoire,ce qui n'est pas trop normal je pense...


Essaye de faire un programme minimal qui ne fait pas ce que tu voudrias,
si tu n'aa pas compris la snolution en le faisant il nous sera plus
facile de dire pourquoi il e donne pas les résultats que tu attends.