Executer une commande avec exec

Signaler
Messages postés
108
Date d'inscription
samedi 31 mars 2012
Statut
Membre
Dernière intervention
16 juin 2013
-
Messages postés
108
Date d'inscription
samedi 31 mars 2012
Statut
Membre
Dernière intervention
16 juin 2013
-
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

Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
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
Messages postés
108
Date d'inscription
samedi 31 mars 2012
Statut
Membre
Dernière intervention
16 juin 2013

char chaine[TAILLE];
fgets(chaine,TAILLE,stdin);
execvp(chaine,NULL);

Mais il marche puis exec ne fais pas ce que je veuts
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
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
Messages postés
108
Date d'inscription
samedi 31 mars 2012
Statut
Membre
Dernière intervention
16 juin 2013

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);
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
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
Messages postés
108
Date d'inscription
samedi 31 mars 2012
Statut
Membre
Dernière intervention
16 juin 2013

Un grand merci par contre dans le code que tu m'as passé j'ai pas trop compris
cmd[0][size] = 0;
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
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
Messages postés
108
Date d'inscription
samedi 31 mars 2012
Statut
Membre
Dernière intervention
16 juin 2013

merci!! Là j'ai bien compris exec
Messages postés
108
Date d'inscription
samedi 31 mars 2012
Statut
Membre
Dernière intervention
16 juin 2013

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
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
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
Messages postés
108
Date d'inscription
samedi 31 mars 2012
Statut
Membre
Dernière intervention
16 juin 2013

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
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
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
Messages postés
108
Date d'inscription
samedi 31 mars 2012
Statut
Membre
Dernière intervention
16 juin 2013

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
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
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
Messages postés
108
Date d'inscription
samedi 31 mars 2012
Statut
Membre
Dernière intervention
16 juin 2013

je avais essayer pour voir
Messages postés
108
Date d'inscription
samedi 31 mars 2012
Statut
Membre
Dernière intervention
16 juin 2013

Sans résultat j'arrive toujours pas à comprendre
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
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
Messages postés
108
Date d'inscription
samedi 31 mars 2012
Statut
Membre
Dernière intervention
16 juin 2013

Mon souci à moi c'est cmt mettre les arguments da le reste du tableau avec cm[0] qui va contenir la commande