Récupérer valeur sortie exec
Fermé
Nb2
-
2 juin 2016 à 18:39
paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 - 3 juin 2016 à 18:24
paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 - 3 juin 2016 à 18:24
A voir également:
- Récupérer valeur sortie exec
- Recuperer message whatsapp supprimé - Guide
- Recuperer video youtube - Guide
- Récupérer mon compte facebook désactivé - Guide
- Comment récupérer un compte facebook piraté - Guide
- Impossible de récupérer mon compte gmail - Guide
1 réponse
paly2
Messages postés
254
Date d'inscription
vendredi 29 août 2014
Statut
Membre
Dernière intervention
15 février 2018
25
Modifié par paly2 le 3/06/2016 à 16:05
Modifié par paly2 le 3/06/2016 à 16:05
Il faut que le processus fils écrive la valeur de retour dans une variable à une adresse connue.
Note que execl ne retourne que s'il y a eu une erreur dans l'exécution de la fonction (pas celle du processus appelé).
Si c'est le retour du processus appelé que tu souhaites en fait récuperer (et visiblement c'est le cas), il faut utiliser la variable status que tu as la bonne idée de récupérer :
La curiosité est une excellente qualité !
# include <stdio.h> # include <unistd.h> # include <sys/wait.h> # include <stdlib.h> # include <string.h> # include <assert.h> int parse(const char* arg, int* exec_return) { int t; t = fork(); if (t < 0) return -1; if (t == 0) { *exec_return = execl("/bin/sh", "sh", "-c", arg,NULL); // On modifie à l'adresse d'exec_return. exit(1); } return t; } int main(int argc, char *argv[]) { int t, tt, status, i, exec_return; for (i = 1; i < argc; i++) { exec_return = 0; t = parse(argv[i], &exec_return); // S'il n'y a pas eu d'erreur, exec_return est resté à 0 (parce que execl n'a pas retourné), sinon, il est passé à -1. printf("exex_return: %d\n", exec_return); tt = wait(&status); assert(tt == t); } return 0; }
Note que execl ne retourne que s'il y a eu une erreur dans l'exécution de la fonction (pas celle du processus appelé).
Si c'est le retour du processus appelé que tu souhaites en fait récuperer (et visiblement c'est le cas), il faut utiliser la variable status que tu as la bonne idée de récupérer :
tt = wait(&status); if(WIFEXITED(status)) printf("Retour de la commande: %d\n", WEXITSTATUS(status));
La curiosité est une excellente qualité !
3 juin 2016 à 16:15
En fait, la fonction system() fait exactement ce que ton programme faisait: elle fork(), elle execve(), elle wait() puis elle retourne.
3 juin 2016 à 17:51
Je confirme. C'est le mal absolu cette fonction system() :-).
Si c'est pour l'utiliser, autant programmer dans un autre langage car niveau performance elle n'est pas terrible.
Côté sécurité, le problème est que si l'utilisateur contrôle la variable dedans (accès direct sans contrôle, buffer overflow, etc.), il peut faire exécuter du code.
3 juin 2016 à 18:24