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 :

mkfifo + execv


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2011
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 23
    Points : 12
    Points
    12
    Par défaut mkfifo + execv
    Bonjour, petit projet pendant les vacances (comme mon camarade du dessous ).

    Je bute sur une étape où je dois faire communiquer plusieurs programme.
    Voila ce que je veux faire.

    Avec mon lanceur, j'ouvre un tube nommé dans lequel j'écris un message, j’exécute mon programme numéro 2 avec execv dans lequel je lis ce qu'il y a dans le tube exécute quelques opérations (pas de problème de ce coté la), et réécris le message à la fin dans ce même tube.

    Mon problème arrive lorsque je lance le tube sur le lanceur, il semble attendre quelque chose et n'exécute pas ma commande execv, il n'affiche pas non plus le printf "test".
    Voila le code "lanceur":

    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
    int main(int argc, char **argv){
    	int fd,tube,resWrite;
    	char message[256];
    	strcpy(message,argv[1]);
    	printf("\n message => %s\n",message);
    	char *arguments[] = {"petale","4",NULL};
    	// creation du tube et envoie du premier message
    	printf("test");
    	//mkfifo("tube",0777);
     
    	if((tube = open("tube",O_WRONLY)) == -1){
    			printf("erreur erno => %d",errno);
    			exit(1);
    	}
    	if((resWrite = write(tube,message,256)) == -1){
    			printf("erreur write errno=> %d",errno);		
    			exit(1);
    	}
    	execv("petale",arguments);			
    }
    Voici ce que j'ai de l'autre coté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main(int argc, char **argv){
    	int n,fd;
    	int nbFils = atoi(argv[1]);
    	char * msg = (char *)malloc(sizeof(char)*256);
     
    	//LECTURE DANS LE TUBE
     	if((fd = open("tube",O_RDONLY)) == -1){
    	}
    	read(fd,msg,TAILLE_MESSAGE);
     
    	//le tube est cree au debut de la premiere petale ensuite chaque petale y accede
    	creerPetale2(msg,nbFils);
    }
    J'ai réussi à faire tout de même un programme simple avec mkfifo ou j'ai une partie écrivain et lecteur, il y a quelque chose que je ne dois pas comprendre avec cette fonction...

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Sauf erreur de ma part, ton tube nommé est en ouverture bloquante, il attend donc d'être ouvert en lecture pour continuer l'exécution et te laisser écrire dedans. Tu peux lancer ton execv avant l'ouverture du tube, la lecture est bloquante aussi, donc tes deux programmes devraient être synchro.

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2011
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Hummm j'ai changé mais ça ne marche toujours pas.

    Il y a toujours un problème avec mkfifo.
    Dans ce code la il n'affiche même pas "test". Je suis un peu paumé là ...

    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
    int main(int argc, char **argv){
    	int fd,tube,resWrite;
    	char message[256];
    	strcpy(message,argv[1]);
    	printf("\n message => %s\n",message);
    	char *arguments[] = {"petale","4",NULL};
    	// creation du tube et envoie du premier message
    	printf("test");
    //	mkfifo("tube",0777);
    	execv("petale",arguments);
    	if((tube = open("tube",O_WRONLY)) == -1){
    			printf("erreur erno => %d",errno);
    			exit(1);
    	}
    	if((resWrite = write(tube,message,256)) == -1){
    			printf("erreur write errno=> %d",errno);		
    			exit(1);
    	}
     
    }

  4. #4
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    Bonjour,

    Je n'ai pas testé ton code, mais, étant donné que le flux de sortie standard stdout est bufferisé par ligne par défaut, tu devrais forcer l'écriture des données en ajoutant un caractère de fin de ligne '\n' après ta chaîne de caractère test. Si, je ne sais par quel miracle, quelque boucle infinie ou autre erreur de segmentation venait à se produire ensuite, sans que le flux de sortie ne soit flushé, tu ne verra pas ta chaîne écrite, alors qu'on a bien dépassé l'instruction vis-à-vis du flot d'exécution.

    La meilleure solution reste encore d'utiliser un débogueur, qui, lui, te permettra de suivre efficacement le déroulement de ton programme. C'est essentiellement plus fiable, parce que, parfois, des débordements mémoires causent l'écrasement de quelques bytes dans des appels à ou fprintf ; ça devient alors infernal à déboguer (le cas typique de l'algorithme qui ne marche que quand on ajoute une instruction inutile...).

    Bonne journée !
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2011
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    J'ai modifié un peu en ajoutant un processus fils pour séparer l'execv de l'écriture dans le tube nommé et ça marche.
    Je pense que ça vient du fait que execv passe directement au programme visé et zappe la fin de mon main.

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

Discussions similaires

  1. execv execvp et >
    Par wkd dans le forum Linux
    Réponses: 5
    Dernier message: 25/01/2007, 14h26
  2. Pipes UNIX avec os.mkfifo
    Par gaston_lagaffe dans le forum Général Python
    Réponses: 1
    Dernier message: 01/11/2006, 11h54
  3. probleme avec os.execv
    Par iwky dans le forum Général Python
    Réponses: 5
    Dernier message: 08/06/2006, 16h56
  4. Réponses: 5
    Dernier message: 13/12/2005, 14h48
  5. [langage] mkfifo en PERL ?
    Par Gogoye dans le forum Langage
    Réponses: 12
    Dernier message: 21/01/2004, 19h44

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