[C + Linux] Problème de pipe

Hello,
j’ai une petite application à faire avec un client qui résout un labyrinthe fournit par un serveur.
Le client et le serveur fonctionnent sur la même machine, ce sont deux processus de la machine et ils discutent entre eux à l’aide de deux tubes nommés.

Les deux tubes servent à la communication inter-processus, le premier tube permet au serveur de donner le nom d’un fichier à mapper en mémoire au client et le second tube permet au client de l’avertir lorsqu’il a terminé sa résolution.

En fait le problème, c’est que lorsque j’ai ouvert le second tube et que j’essaye de lire ce que le serveur a mis dans le premier tube, la méthode read() plante et me renvoie comme erreur Bad Address.
Avec le même code, sans ouvrir le second tube en lecture, tout se passe comme il faut et j’arrive à lire le message du serveur dans le tube…

Comme les sources sont un peu grosses pour les lister ici, je les mets dans une archive jointe au message… j’espère que qqn pourra me filer un petit coup de main, parce que je nage complètement là.

Ah si jamais, il faut lancer le server en premier, c’est lui qui crée les tubes nommés.
Il prend 3 paramètres, un nom de fichier et le nom des deux tubes
vous pouvez par exemple le lancer avec la commande
./server_pipe fichier tube1 tube2

Le client ne prend que 2 paramètres, le nom des deux tubes.
./client_pipe tube1 tube2

Les autres fichiers, single, server et client sont des autres versions
Single faisant fonctionner la recherche et la création du labyrinthe dans un seul processus
Server et Client font fonctionner dans deux processus mais sans communication entre les deux.

Merci !

Edit : modifié l’archive, celle-ci est plus propre…

Arf, ça me rappelle mon projet d’IA de maîtrise, les labyrinthes (sauf que c’était plus compliqué car c’était la même chose que le jeu Boxxle sur gameboy, à savoir pousser et ranger des caisses)

Sinon ça fait hélas trop longtemps que je n’ai pas fait de C pour pouvoir t’aider, sorry

J’ai eu un problème similaire à résoudre cette année en 2114 pour ceux qui sont à l’ucl comme moi sans avoir de traitment important.

En faite les pipe c’est bien mais c’est pas très souple à mon gout. La solution c’est
1.le serveur crée le pipe (mkfifo),
2. le serveur ouvre le pipe en lectture (et pas d’abord en ecriture)
3. le client écrit dedans

Alors comment faire pour que le serveur qui deviendra client de ton client sache ou ecrire et bien tu lui passes dans le pipe.

Pour faire simple ton client et ton serveur doivent tous les 2 crées un pipe et l’ouvrir en ecriture.

Je pense que chaque fois que tu essayera d’ouvrir un pipe en ecriture qui n’est pas déjà ouvert en lecture de l’autre coté tu aurras une erreur.

Maintenant attention parceque là tu risque d’avoir de l’attente active si ton serveur va lire en continu en attendant que tu écrives qqch dedans. Pour éviter ca tu dois utiliser un fstab si je me souviens bien.

Je sais pas si j’ai été assez claire sinon ben demande j’essayerai de faire mieux.

Je n’arrive pas à ouvrir ton archive, il semble qu’elle a pris un coup dans la tête. En revanche je me souviens que les pipe sont souvent capricieuses et que de les ouvrir des 2 cotes en lecture ET écriture (même si l’on a juste besoin de lire) permet de résoudre beaucoup de problèmes.

Je ne peux pas t’aider beaucoup plus sans les sources.

[quote name=‘Merlin’ date=’ 6 Jan 2005, 18:53’]Je n’arrive pas à ouvrir ton archive, il semble qu’elle a pris un coup dans la tête.

Je ne peux pas t’aider beaucoup plus sans les sources.
[right][post=“319675”]<{POST_SNAPBACK}>[/post][/right][/quote]

Bon, à voir les tar.gz ont pas l’air d’être appréciées… étrange
bref ça marche avec le zip maintenant…

klimmrod : euh je suis pas sûr de tout comprendre là… tu veux bien jeter un coup d’oeil aux sources et me dire si tu vois un truc qui te semble faux?

Le plus gros problème dans ton programe c’est que tu dois d’abord ouvrir le tube en lecture d’un coté puis en ecriture de l’autre. Si tu commences à ouvrir ton pipe en ecriture ton programme plantera toujours.

C’est pour ca que le plus simple et le plus logique c’est que chaque process crée son pipe et l’ouvre en lecture.

Ainsi ton serveru cré un pipe ou il attend des requetes.
Quand ton client se lance il cré un pipe du nom de son PID par exemple puis envois au serveur le nom du pipe en plus des autres infos.

Sinon je suis étonné que tu n’utilises pas mkfifo pour créer ton pipe. Mais le boulot est p-ê le même avec mknod.

[quote name=‹ klimmrod › date=’ 7 Jan 2005, 09:27’]Le plus gros problème dans ton programe c’est que tu dois d’abord ouvrir le tube en lecture d’un coté puis en ecriture de l’autre.  Si tu commences à ouvrir ton pipe en ecriture ton programme plantera toujours. 

C’est pour ca que le plus simple et le plus logique c’est que chaque process crée son pipe et l’ouvre en lecture. 
[right][post=« 319849 »]<{POST_SNAPBACK}>[/post][/right][/quote]
Effectivement, c’est ce que j’ai fait et ça marche mieux.

Par contre pour le bad address… Je me hait !
L’erreur venait pas du tout d’un problème avec les pipes mais d’un pointeur non instancié… Le prof a mis juste 1 seconde pour repérer l’erreur… :stuck_out_tongue:

Enfin, ce sont les joies du C…

[quote name=‹ klimmrod › date=’ 7 Jan 2005, 09:27’]Sinon je suis étonné que tu n’utilises pas mkfifo pour créer ton pipe.  Mais le boulot est p-ê le même avec mknod.
[right][post=« 319849 »]<{POST_SNAPBACK}>[/post][/right][/quote]

Zut, j’ai oublié de demander ça au prof. On a utilisé mknod parce que c’était ce qu’il utilisait dans son cours, mais effectivement ça devrait fonctionner de la même manière avec mkfifo, je vais demander et je redis.