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

C Discussion :

Commandes exec ou system avec threads


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de Pandapi
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 38
    Par défaut Commandes exec ou system avec threads
    Bonjour,


    Bon alors pour expliquer un peu le problème qui m'amène.
    En gros j'ai un code en C contenant une boucle créant plusieurs threads en leur donnant une fonction à éffectuer.

    Mon problème est que dans cette fonction je dois faire un appel à gcc, et donc j'utilisais exec...
    Mais voilà, avec exec je perd la main et ma boucle sencée créer plusieurs threads s'arrête lorsque qu'un exec a été effectué par un thread.

    J'ai cherché un peu et j'ai trouvé la commande system utilisable et qui ne me ferait pas perdre la main, mais elle me pose également un problème c'est qu'il n'y a aucune valeur de retour, hors il me faudrait un retour sur les éventuels problèmes rencontrés par gcc...

    Donc voilà, je sais pas si c'est clair, en gros il me faudrait soit un moyen d'avoir un retour avec system, soit de ne pas perdre la main avec exec, ou encore une 3ème commande qui irait

    Je vous met ce que donne mon code en gros pour que vous ayiez une idée de la chose :

    Code : 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
    void *compile(char *nom_fichier)
    {
    	execlp("gcc", "gcc", "-c", nom_fichier, NULL);
     
    	exit(0);
    }
     
     
    int main(int argc, char *argv[])
    {
    	int i;
     
    	pthread_t pthread_id[argc];
     
    	for(i=1 ; i<argc ; i++)
    	{
    		if(pthread_create(&pthread_id[i-1], NULL, (void *)compile, argv[i]) == -1)
    		{
    			printf("Erreur à la création du thread");
    			exit(-1);
    		}
    	}
     
    	for(i=1 ; i<argc ; i++)
    	{
    		pthread_join(pthread_id[i-1], NULL);
    	}
    	return(0);
    }


    Voilà merci à ceux qui pourront m'aider, je précise que ce n'est pas la peine de revoir mon code sur l'utilité de l'utilisation de threads et autre vu que je n'ai pas le choix du sujet ^^

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    La fonction system renvoie le résultat du programme lancé :
    Citation Envoyé par man system
    La valeur renvoyée est 127 si l'appel système execve() pour /bin/sh échoue, -1 si une autre erreur se produit, ou le code de retour de la commande sinon.
    Si tu veux avoir un retour texte de sa qui se passe, tu peux utiliser popen.

  3. #3
    Membre averti Avatar de Pandapi
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 38
    Par défaut
    Ah on peut récuperer l'information d'erreur avec system() ?
    Je pensais que non, je vais essayer alors et je vous tiens au courant de l'avancement

    Merci

  4. #4
    Membre averti Avatar de Pandapi
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 38
    Par défaut
    Re-salut,

    Bon alors j'ai un peu avancé, maintenant les compilations on l'air de bien marcher, mais j'ai toujours un petit problème, je vous donne ce que donne mon code ainsi que ce que j'obtiens quand j'exécute :


    Code : 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
    void compile(char *nom_fichier)
    {
    	char *commande;
     
    	commande = (char*) malloc((strlen("gcc -c ")+(strlen(nom_fichier)))*sizeof(char));
     
    	strcat(commande, "gcc -c ");
    	strcat(commande, nom_fichier);
     
    	if(system(commande) != 0)
    	{
    		perror("Problème lors de la compilation\n");
    	}
     
    	free(commande);
     
    }
     
     
    int main(int argc, char *argv[])
    {
    	int i;
     
    	pthread_t pthread_id[argc];
     
    	for(i=1 ; i<argc ; i++)
    	{
    		if(pthread_create(&pthread_id[i-1], NULL, (void *)compile, argv[i]) == -1)
    		{
    			printf("Erreur à la création du thread");
    			exit(-1);
    		}
    	}
     
    	for(i=1 ; i<argc ; i++)
    	{
    		pthread_join(pthread_id[i-1], NULL);
    	}
    	return(0);
    }
    gcc: ex20.c : Aucun fichier ou répertoire de ce type
    gcc: pas de fichier à l'entrée
    Problème lors de la compilation
    : Success

    Voilà, en gros j'ai essayé de donner à compiler le nom d'un fichier qui n'existe pas, les premières lignes viennent directement de gcc, la partie affichée par mon code est un message Success...

    Je pense que ça doit venir des différents threads qui changent la valeur de perror avant que les autres aient affiché leurs erreurs (je ne sais pas si c'est très clair).

    En tout cas si quelqu'un a une idée merci d'avance, moi je dois filer en cours.

    A bientot

  5. #5
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Mets le nom de fichier en absolu et pas en relatif.
    Cordialement.

  6. #6
    Invité(e)
    Invité(e)
    Par défaut
    Attention, il manque la place pour stocker le '\0' final :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    commande = malloc((strlen("gcc -c ") + strlen(nom_fichier) + 1)*sizeof(char));

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. commande SYSTEME avec FLASH
    Par athmane1988 dans le forum Flash
    Réponses: 1
    Dernier message: 10/02/2009, 23h26
  2. Réponses: 7
    Dernier message: 13/03/2008, 13h03
  3. Problème avec la commande EXEC()
    Par kleoptras dans le forum POSIX
    Réponses: 10
    Dernier message: 19/06/2007, 01h57
  4. problème avec les commandes run() et start() de Thread
    Par -Juliette- dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 18/06/2007, 10h08
  5. [Appli Console]Pb exec command ac fct system(const char *)
    Par Le_magicien999 dans le forum MFC
    Réponses: 2
    Dernier message: 16/08/2005, 16h07

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