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

POSIX C Discussion :

Probleme de boucle avec des processus sous UNIX


Sujet :

POSIX C

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Points : 10
    Points
    10
    Par défaut Probleme de boucle avec des processus sous UNIX
    Bonsoir,
    je dois créer un interpreteur de commandes qui lit les commandes dans un fichier et les exécute en créant des processus. Pour lire la commande, je me suis fait une fonction qui lit une ligne et la dispose dans un tableau d'arguments pour utiliser les fonctions execs. Mon problème survient lorsque je fais la création des processus, le dernier processus est toujours créer 2-3 fois au lieu de une. Ma fonction pour lire les commandes marche parfaitement et ignore les ligne vides lorsque je la test dans les process. Ma boucle pour la création des processus ressemble à ceci:
    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
    while (!feof(fichier))
    			{
    				lireLigneCmd(fichier,tabParams);
    				i = 0;
    				while (tabParams[i] != NULL)
    				{
    					printf("%s", tabParams[i]);
    					i++;
    				}
    				if (tabParams[0] != NULL)
    				{
    					pid = fork();
    					if (pid < 0)
    					{
    						printf("Une erreur c'est produite lors de la creation du processus...");
    					}
    					if (pid != 0)
    					{
    						waitpid(pid,&statut,0);	
    					}
    					else
    					{
    						if (*(tabParams[0]) != '/')
    						{
    							execvp(tabParams[0],tabParams);
    						}
    						else
    						{
    							execv(tabParams[0],tabParams);
    						}
    					}
    				}	
    				else
    				{
    					printf("Ligne ne contenant aucune commande, celle-ci est ignoree...\n");
    				}
    			}
    Pour certaines raisons la derniere ligne s'exécute toujours 2 fois meme lorsque la condition est rencontré et qu'il devrait sortir de la boucle... je ne comprends pas puisqu'il ne le fait pas lorsqu'il n'y a pas création des processus.
    Merci d'avance pour votre aide.

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Celà provient sans doute de feof(fichier) qui ne fait sans doute pas ce que tu crois. foeof ne doit être appelé qu'après que la lecture aie échoué, pour savoir si la fin de fichier a été atteinte ou s'il y a erreur de lecture.

    Comment lis-tu le fichier dans lireLigne(fichier, tabParam) ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    j'ai testé en retournant le dernier caractère avec lireLigneCmd et même lorsque le caractère était EOF, celui-ci entrait dans la boucle quand même et la condition était (test != EOF). Pour faire la lecture de la ligne, j'utilise fgetchar jusqua ce que je rencontre \n ou EOF.

  4. #4
    Membre à l'essai
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Si j'enleve la création des processus, tout marche à merveille.

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Tu devrais utiliser fgets(ligne, sizeof(ligneà, fichier); et virer le \n, c'est la méthode classique et sûre.
    Si fgets retourne NULL c'est que le fichier est lu en entier.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  6. #6
    Membre à l'essai
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    le probleme c'est que le dernier processus retourne à la derniere ligne valide et recommence a partir de la. Donc si il y avait des lignes vides apres le dernier exec et les relit aussi.

  7. #7
    Membre à l'essai
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    J'ai finalement résolu le probleme, la position du pointeur était modifier dans le processus et j'ai du la sauvegarder avec ftell et la repositionner apres le fork() avec fseek.

Discussions similaires

  1. Probleme de tri avec des sous requêtes
    Par kamnouz dans le forum Requêtes
    Réponses: 1
    Dernier message: 20/04/2010, 10h03
  2. [Unix][9i] insert avec des variable ($) sous Korn Shell
    Par weejungle dans le forum Oracle
    Réponses: 1
    Dernier message: 20/09/2006, 12h41
  3. [JAR]Création d'un JAR avec des dependances sous Eclipse
    Par muthnik dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 05/07/2005, 17h39
  4. Réponses: 14
    Dernier message: 09/08/2004, 13h42
  5. Réponses: 6
    Dernier message: 04/04/2003, 15h28

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