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

  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));

  7. #7
    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 bonjour,

    En fait je dois m'être mal expliqué Nicolas, le chemin relatif marche, mais je voulais justement tester ce que faisait le programme dans un cas où on lui fournissait un fichier inéxistant.

    En utilisant perror je pensais afficher les éventuelles erreurs de compilations s'il y en avait, mais dans mon test alors que le fichier n'existait pas et que la compilation ne se faisait pas, le message perror était "success"...

    Je pense que cela vient de l'utilisation des threads, j'ai regardé un peu la doc et perror affiche la dernière erreur système si je ne me trompe pas...
    Hors avec des threads il se peut que la compilation s'effectue mal, qu'un des autres threads prenne la main et compile sans problème et donc change la valeur de perror, et quand le premier thread reprend la main et fait son perror... il n'affiche pas le bon message

    Etant donné que c'est un exo en plusieurs étapes et qu'après je dois le refaire en utilisant des sémpahores, je suppose que je suis sencé trouver une autre solution pour que ça marche pour le moment.


    Voilà j'espère avoir été plus clair, en tout cas merci pour votre aide, ça m'a déjà aider à arriver jusque là

  8. #8
    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
    Citation Envoyé par Pandapi Voir le message
    Re bonjour,

    En fait je dois m'être mal expliqué Nicolas, le chemin relatif marche, mais je voulais justement tester ce que faisait le programme dans un cas où on lui fournissait un fichier inéxistant.

    En utilisant perror je pensais afficher les éventuelles erreurs de compilations s'il y en avait, mais dans mon test alors que le fichier n'existait pas et que la compilation ne se faisait pas, le message perror était "success"...
    Ok:
    int system(const char *command);
    RETURN VALUE
    If command is not a null pointer, system() shall return the termination status of the command language interpreter in the format specified by waitpid(). The termination status shall be as defined for the sh utility; otherwise, the termination status is unspecified. If some error prevents the command language interpreter from executing after the child process is created, the return value from system() shall be as if the command language interpreter had terminated using exit(127) or _exit(127). If a child process cannot be created, or if the termination status for the command language interpreter cannot be obtained, system() shall return -1 and set errno to indicate the error.
    et donc
    pid_t waitpid(pid_t pid, int *stat_loc, int options);
    Regardless of its value, this information may be interpreted using the following macros, which are defined in <sys/wait.h> and evaluate to integral expressions; the stat_val argument is the integer value pointed to by stat_loc.

    WIFEXITED(stat_val)
    Evaluates to a non-zero value if status was returned for a child process that terminated normally.
    WEXITSTATUS(stat_val)
    If the value of WIFEXITED(stat_val) is non-zero, this macro evaluates to the low-order 8 bits of the status argument that the child process passed to _exit() or exit(), or the value the child process returned from main().
    WIFSIGNALED(stat_val)
    Evaluates to a non-zero value if status was returned for a child process that terminated due to the receipt of a signal that was not caught (see <signal.h>).
    WTERMSIG(stat_val)
    If the value of WIFSIGNALED(stat_val) is non-zero, this macro evaluates to the number of the signal that caused the termination of the child process.
    WIFSTOPPED(stat_val)
    Evaluates to a non-zero value if status was returned for a child process that is currently stopped.
    WSTOPSIG(stat_val)
    If the value of WIFSTOPPED(stat_val) is non-zero, this macro evaluates to the number of the signal that caused the child process to stop.
    WIFCONTINUED(stat_val)
    Evaluates to a non-zero value if status was returned for a child process that has continued from a job control stop.

  9. #9
    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
    Ok je vais essayer de récuperer les erreurs de compilations avec ça, merci

    Je vous tiens au courant de l'avancement, ça pourra peut être aider d'autres gens si j'arrive à faire un code qui marche

  10. #10
    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
    Attention, depuis tout à l'heure, tu emplois le mot compilation à la place d'exécution. Ceux sont deux choses totalement différentes.
    Cordialement.

  11. #11
    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
    Non non

    C'est à cause de mon code que je dis compilation, parce que la commande exécutée par la fonction system() est une compilation : gcc -c...
    Le programme compile les fichiers qui lui sont donnés en entrée, c'est pour ça que je dis récuperer les erreurs de compilation, car lors de son exécution mon programme compile

    Enfin pour le moment j'ai un fichier en bison à faire... je regarderais mon code ce soir ou demain ^^

+ 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