Executer une commande avec exec

andoid Messages postés 108 Date d'inscription samedi 31 mars 2012 Statut Membre Dernière intervention 16 juin 2013 - 10 oct. 2011 à 11:47
andoid Messages postés 108 Date d'inscription samedi 31 mars 2012 Statut Membre Dernière intervention 16 juin 2013 - 10 oct. 2011 à 19:42
Bonjour!

j'aimerai exécuter une commande avec exec mais j'arrive pas: je m'explique
je recupere la saisie de la commande sur le terminal grace a fgets:
char chaine[TAILLE];
fgets(chaine,TAILLE,stdin);
une fois la recuperer dans la chaine je sais pas comment l'éxéxuter.
C'est à ce niveau que je bloque

18 réponses

cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 124
10 oct. 2011 à 12:09
Pourquoi faire un fgets, normalement réservé à la lecture dans un fichier, plutôt qu'un simple scanf ?
Fais voir le code de ton exec. (execvp normalement).

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
andoid Messages postés 108 Date d'inscription samedi 31 mars 2012 Statut Membre Dernière intervention 16 juin 2013
10 oct. 2011 à 13:00
char chaine[TAILLE];
fgets(chaine,TAILLE,stdin);
execvp(chaine,NULL);

Mais il marche puis exec ne fais pas ce que je veuts
0
cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 124
10 oct. 2011 à 13:24
Le 2ème argument est mauvais. Il est dit dans la documentation, que ça doit être un tableau qui contient en premier argument le nom de l'exécutable, suivit de ses arguments, puis un NULL.

Exemple donné dans la doc officielle (que tu n'as pas du lire):
const char* paramList[] = {"/bin/ls", "-l", "/u/userid/dirname", NULL};
execvp("/bin/ls", paramList);


Ce qui donne pour toi:
#include <stdio.h>
#include <stdlib.h>
#include 
#include <string.h>

#define TAILLE 256
#define XSTR(X) #X
#define STR(X) XSTR(X)

int main(void)
{
  char* cmd[2];
  char chaine[TAILLE];
  int ret = 0;
  int size = 0;

  scanf("%"STR(TAILLE)"s", chaine);

  size = strlen(chaine);
  cmd[0] = malloc((size + 1) * sizeof(char));
  strncpy(cmd[0], chaine, size);
  cmd[0][size] = 0;
  cmd[1] = NULL;
  ret = execvp(chaine, cmd);
  printf("Error = %i\n", ret);
  free(cmd[0]);

  return 0;
}


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
andoid Messages postés 108 Date d'inscription samedi 31 mars 2012 Statut Membre Dernière intervention 16 juin 2013
10 oct. 2011 à 14:05
A priori le code il marche bie. Je dois un shell et jai codé les commandes ls, cd, pwd, redirection, cat donc si je reçois en ligne de commande ls comment je dois faire pour qu'il execute mon ls sachant que j'arrive à interpreter la commande écrite.
je pense que je vais faire
const char *cmd[]={"path de mon executable",NULL}
execvp(path,cmd);
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 124
10 oct. 2011 à 14:20
Avec l'exemple que je t'ai donné, tu as tout ce qu'il faut pour réussir ton shell.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
andoid Messages postés 108 Date d'inscription samedi 31 mars 2012 Statut Membre Dernière intervention 16 juin 2013
10 oct. 2011 à 14:33
Un grand merci par contre dans le code que tu m'as passé j'ai pas trop compris
cmd[0][size] = 0;
0
cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 124
10 oct. 2011 à 14:51
cmd[0][size] = 0;

cmd est un tableau de chaîne de caractères.
Dans la première case, il y a une chaîne qui contient le nom du binaire.

Sur cette première chaîne, j'ai copié le nom du binaire, mais sans le 0 terminal.
Donc je vais à la dernière case de la chaîne, et j'appose un 0 terminal (0 NULL '\0')
(Je rappelle qu'une chaîne de caractères se termine toujours par un 0 terminal).

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
andoid Messages postés 108 Date d'inscription samedi 31 mars 2012 Statut Membre Dernière intervention 16 juin 2013
10 oct. 2011 à 15:25
merci!! Là j'ai bien compris exec
0
andoid Messages postés 108 Date d'inscription samedi 31 mars 2012 Statut Membre Dernière intervention 16 juin 2013
10 oct. 2011 à 15:30
Bon bref une derniere question par exemple ma commande cat qui j'ai codée elle prend un argument commen faire pour placer l'arguments dans le tableau cmd
0
cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 124
10 oct. 2011 à 15:33
Dans l'exemple donné, tu as: {"ta commande", NULL}
Pour cat, il te suffit de l'adapter pour avoir: {"ta commande", "argument1", argument2", etc..., NULL}.
soit: {"cat", "-n", "fichier", NULL}

Tu avais pourtant déjà un exemple, un peu plus haut...

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
andoid Messages postés 108 Date d'inscription samedi 31 mars 2012 Statut Membre Dernière intervention 16 juin 2013
10 oct. 2011 à 16:12
pour cela j'ai fais sa:

cmd[i]=strtok(command," | - ");
while(cmd[i]!=NULL)
{
cmd[i]=strtok(command," | - ");
i=i+1;
}
cmd[i]=NULL;/*\0*/
mais lorsque je compile sa marche et sa me prend trop la tête
0
cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 124
10 oct. 2011 à 16:20
cmd[i]=strtok(command," | - ");
while(cmd[i]!=NULL)
{
cmd[i]=strtok(command," | - ");
i=i+1;
}
cmd[i]=NULL;/*\0*/


Qu'as-tu essayé de faire ? Ça ne veut pas dire grand chose là.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
andoid Messages postés 108 Date d'inscription samedi 31 mars 2012 Statut Membre Dernière intervention 16 juin 2013
10 oct. 2011 à 16:24
Au faite j'ai voulu utiliser strtok et avec le delimiteur mettre la commande et ses arguments dans le tableau cmd mais je vois que sa marche pas
0
cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 124
10 oct. 2011 à 16:25
Passe un coup de gdb et regarde ce qu'il se passe.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
andoid Messages postés 108 Date d'inscription samedi 31 mars 2012 Statut Membre Dernière intervention 16 juin 2013
10 oct. 2011 à 16:45
je avais essayer pour voir
0
andoid Messages postés 108 Date d'inscription samedi 31 mars 2012 Statut Membre Dernière intervention 16 juin 2013
10 oct. 2011 à 17:02
Sans résultat j'arrive toujours pas à comprendre
0
cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 124
10 oct. 2011 à 17:33
Sans résultat

1) C'est-à-dire ?
2) Que te dis gdb ? (Il te dit forcément quelque chose).

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
andoid Messages postés 108 Date d'inscription samedi 31 mars 2012 Statut Membre Dernière intervention 16 juin 2013
10 oct. 2011 à 19:42
Mon souci à moi c'est cmt mettre les arguments da le reste du tableau avec cm[0] qui va contenir la commande
0