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 :
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
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); } } }
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.
Partager