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 :

Tube et synchronisation


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Avril 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2014
    Messages : 6
    Points : 9
    Points
    9
    Par défaut Tube et synchronisation
    Bonjour
    Pour un projet je dois faire tourner en même temps plusieurs programme et les faire communiquer.
    Pour l'instant je n'en suis qu'au premier programme, celui ci doit avoir un fils qui se consacrera a gérer les communication avec les autres programmes.
    le père et le fils communiquerons via deux tubes anonymes(père->fils et fils->père).
    J'ai mis ces deux tubes dans une structure contenant le nécessaire pour la communication père fils.

    La structure et donc les tubes a l’intérieur sont alloué( malloc() ) avec la création du fils, puis ils sont initialisés après la création du fils( pipe() + close() ).

    Je pensais que lorsqu'un programme effectuais un read dans un tube ou personne n'a encore écrit, le programme attendais jusqu’à ce qu'on y écrive pour passer a la suite du code, or le fils lis une valeur(-1217306624) sorti d'on ne sait ou....

    voila le code d'initialisation des tubes :

    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
     
    void initCom(pid_t pid,communication* comm){
    	///pipe + Fermeture ouverture correspondant pour le pere et le fils
    	if(pipe(comm->tube_Envoie) == -1) {
    			perror("Outils: erreur lors de la creation du tube d'envoie ");
    			exit(EXIT_FAILURE);
    		}
    	if(pipe(comm->tube_Reception) == -1) {
    			perror("Outils: erreur lors de la creation du tube de reception");
    			exit(EXIT_FAILURE);
    	}
    	if(pid!=0){
    		if(close(comm->tube_Reception[ECRITURE]) == -1) {
    			perror("Pere : erreur lors de la fermeture du tube1 en ecriture ");
    			exit(EXIT_FAILURE);
    		}
    		if(close(comm->tube_Envoie[LECTURE]) == -1) {
    			perror("Pere : erreur lors de la fermeture du tube2 en lecture ");
    			exit(EXIT_FAILURE);
    		}
    	}else{///Si on est dans le fils, on ferme la reception en lecture et l'envoie en ecriture(reservé au pere)
    		if(close(comm->tube_Reception[LECTURE]) == -1) {
    			perror("Fils : erreur lors de la fermeture du tube1 en lecture ");
    			exit(EXIT_FAILURE);
    		}
    		if(close(comm->tube_Envoie[ECRITURE]) == -1) {
    			perror("Fils : erreur lors de la fermeture du tube2 en ecriture ");
    			exit(EXIT_FAILURE);
    		}
    	}
    }
    et le code de la fonction lecture du fils

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int filsRead(communication* comm){
    	printf("Le fils va lire dans le tube !! \n");
    	int entier_lu;
    	if(read(comm->tube_Envoie[LECTURE], &entier_lu, sizeof(int)) == -1) {
    		perror("Fils : erreur lors de la lecture d'un entier depuis le tube ");
    		exit(EXIT_FAILURE);
    	}
    	return entier_lu;
    }

    dans d'autres programmes créé précédemment, la lecture ne lit rien tant que rien n'y a été écris, je pensait pouvoir me servir de cette caractéristique pour "synchroniser" mon programme avec son père sans utilisé de sémaphore(pour le moment), comment puis-jet faire, quelle est le comportement des tubes, des read ect?

    Merci d'avance pour votre aide.

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Avril 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2014
    Messages : 6
    Points : 9
    Points
    9
    Par défaut
    Bon je répond car je pense avoir trouvé d’où venais mon problème, si quelqu'un a le même soucis et que la magie d'internet l'amène ici :

    premièrement (je pense que) pipe() ne doit être effectué que dans le père AVANT la création du fils, et surtout pas que le fils re-pipe le tube de son coté.

    Ensuite, mon programme fils se mettait bien en attente du message du père, simplement, le programme se terminant avant d’écrire quelque chose, le fils devant retourner une valeur malgré la "destruction" ou la libération mémoire du tube du coté du père, il renvoie une valeur(correspondant a quelque chose qui m’échappe).

    Vous l'aurez compris je n'ai pas le détails je ne fait que des supposition, néanmoins j'ai compris grossièrement le pourquoi du comment ^^

    [sujet a fermé s'il vous plaît]

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 30/03/2014, 12h44
  2. Synchronisation procesus lectures/ecritures tubes
    Par sharantyr dans le forum C++
    Réponses: 3
    Dernier message: 05/06/2006, 22h44
  3. Problème avec fgets et tube...
    Par tchingoo dans le forum POSIX
    Réponses: 5
    Dernier message: 22/08/2003, 17h03
  4. Synchronisation de base de données locale/distante Internet
    Par StefC30 dans le forum Développement
    Réponses: 3
    Dernier message: 25/07/2003, 14h47
  5. Tube a partir de polysegments
    Par seb m. dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 18/12/2002, 17h08

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