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
    Futur Membre du 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
    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 : 734
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 confirm�
    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
    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