IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Problème utilisation execvp


Sujet :

Linux

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Problème utilisation execvp
    Bonjour;

    Mon programme doit créer des processus fils afin de lancer les commandes passées au main du programme dans argv, voici mon code:

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <unistd.h>
    #include <string.h>
    #define NBMOTSMAX 20
     
    int main(int argc, char *argv[]){
    	pid_t pid;
    	int nbMots = argc-1, status, i;
    	char *commandes[NBMOTSMAX];
     
    	for(i=0; i < nbMots; i++)
    	{
    		commandes[i] = argv[i+1];
     
    	}
     
    	commandes[nbMots]=(char *) NULL;
     
    	for(i=0; i < nbMots; i++){
    		switch(pid=fork()){
    			case -1: perror("Processus Fils");
    				break;
    			case 0: printf("[%d] Je lance %s :\n", getpid(), commandes[i]);
    				execvp(commandes[i], commandes);
    				exit(1);
    				break;
    			default:
    				printf("[%d] J'ai délégué %s à %d. J'attends sa fin...\n", getpid(), commandes[i], pid);
    				wait(&status);
    				printf("[%d] %d terminé.\n", getpid(), pid);
    		}
    	}
     
    	printf("[%d] J'ai fini.\n", getpid());
     
    	return 0;
    }

    Mais j'ai un gros problème j'ai du mal a comprendre comme exécuter execvp même en lisant le man, vu l'exécution du programme je pense que mon erreur vient de la première case du tableau "commandes" qui doit contenir un lien vers le fichier executable mais après avoir tenté plusieurs choses rien ne marche, voila un exemple de l'exécution du programme avec ./exo2TP1 "sleep 5" pwd date j'obtiens la chose suivante:

    Nom : 2019-02-17-181620_1024x600_scrot.png
Affichages : 641
Taille : 129,9 Ko

    J'ai donc tenté de remplacer la première case du tableau commande par plusieurs fichiers exécutable contentant les commandes linux comme /bin mais peu concluant.
    Voila si quelqu'un pourrait m'aider à utiliser execvp s'il vous plait car la je suis vraiment dans l'impasse

    Merci d'avance.

  2. #2
    Membre du Club
    Homme Profil pro
    .
    Inscrit en
    Octobre 2019
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Octobre 2019
    Messages : 21
    Points : 44
    Points
    44
    Par défaut
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    char *commandes[NBMOTSMAX];
    for(i=0; i < nbMots; i++)
    {
        commandes[i] = argv[i+1];
    }
     
    commandes[nbMots]=(char *) NULL;

    fait une copie d'argv. Alors il faut noter que, comme c'est le cas avec "sleep 5", l'argument "5" fait partie de la même chaîne que "sleep". Cependant, selon man 3 exec (en français) :

    L'argument initial de toutes ces fonctions est le chemin d'accès du fichier à exécuter.
    L'argument initial étant "sleep 5", ça ne semble pas correct. Il faut séparer cette chaîne et passer "5" à execvp comme argument. À l'instant, tu passes tous les arguments après celui que tu veux exécuter. Remplaçant les variables par leurs contenus, tu appelles execvp comme suit :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    execvp("sleep 5", { "pwd", "date", NULL })
    execvp("pwd", { "date", NULL })
    execvp("date", { NULL })

    Par contre, ce que tu veux est :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    execvp("sleep", { "5", NULL })
    execvp("pwd", { NULL })
    execvp("date", { NULL })

    De plus, pourquoi pas utiliser argv directement au lieu de faire une copie ? argv doit être terminé par un pointeur NULL et est modifiable. En tout cas, on peut remplacer (char *) NULL par NULL, la conversion est néanmoins effectué grâce au type de commandes. La phrase

    ce pointeur doit être transtypé avec (char *) NULL
    s'adresse aux fonctions variadiques auxquelles execvp n'appartient pas.

Discussions similaires

  1. Problème utilisation DLL
    Par Tub-95 dans le forum MFC
    Réponses: 4
    Dernier message: 02/11/2005, 12h00
  2. [Tomcat][Spring] Problème utilisation mémoire
    Par Wutintin dans le forum Hibernate
    Réponses: 12
    Dernier message: 08/09/2005, 14h57
  3. [JSTL] [EL] Problème utilisation <c:out>
    Par XavierL dans le forum Taglibs
    Réponses: 7
    Dernier message: 14/08/2005, 20h12
  4. (Problème) Utilisation de l'API mySQL [Delphi 2005 Perso]
    Par will-scs dans le forum Bases de données
    Réponses: 2
    Dernier message: 08/08/2005, 18h26
  5. [JAR]Problème utilisation manifest et jar
    Par doudine dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 07/01/2005, 10h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo