Probleme avec un Pipe [C] - C - Programmation
Marsh Posté le 27-09-2008 à 16:40:20
j'ai améliorer un peu le truc :
Code :
|
maintenant voilà l'erreur :
Erreur (pipe): : Success
lol
Erreur (write): : Illegal seek
lg :4Erreur (read): : Illegal seek
Erreur (read): : Invalid or incomplete multibyte or wide character
lo������p���Ŀ4��o��p��
plop
Erreur (write): : Illegal seek
Erreur (write): : Illegal seek
lg :3lg :2Erreur (read): : Invalid or incomplete multibyte or wide character
Erreur (read): : Invalid or incomplete multibyte or wide character
Erreur (read): : Invalid or incomplete multibyte or wide character
������p���Ŀ4��o��p���Ŀpl������p���Ŀ4��o��p���Ŀop������p���Ŀ4��o��p��
Erreur (write): : Illegal seek
lg :1ldk@LdK-virtualMachine:~/sgp$ Erreur (read): : Invalid or incomplete multibyte or wide character
p������p���Ŀ4��o��p��
Marsh Posté le 27-09-2008 à 17:59:58
elldekaa a écrit : a écrit :
|
Le contenu de tmp n'est pas défini donc strlen(tmp) non plus. Essai avec fgets(tmp,30,stdin)en vérifiant avant dans le man comment est géré \0 par fgets, faudra peut-être mettre 29.
Prévois aussi un tampon plus grand pour la lecture avec toujours de la place pour \0.
Marsh Posté le 27-09-2008 à 19:14:51
ptitchep a écrit : |
merci ça marche bien maintenant ...
juste un dernier soucis : je voudrais que les processus s'arrete lorsque une chaine vide est taper au clavier :
ma solution est d'envoyer dans le tube le caractere special "$" et ainsi arreter le processus fils ...
je voudrais trouver une solution plus propre (parce que actuellement si je rentre une chaine de caractere avec un "$" dedans le programme se termine.
donc si quelqu'un aurait une idee ...
Code :
|
Marsh Posté le 27-09-2008 à 20:35:26
Avec un signal?
Code :
|
Marsh Posté le 27-09-2008 à 22:15:12
elldekaa a écrit : |
Ce genre de problème existe depuis la création de TCP/IP => comment signaler une fin sans que cette fin arrive "par erreur".
La solution la plus efficace est de donner un couple, par exemple "ab", qui signifie "arrêt".
Mais comment éviter de recevoir par erreur "ab" si par exemple l'émetteur envoie la chaine "abréviation" ? Ben tout simplement en dupliquant la lettre "a".
Donc si l'émetteur envoie "abréviation", le récepteur recevra "aabréviation". En lisant le premier "a" doublé il saura ce que c'est et enlèvera le "a" de trop. Mais s'il reçoit un simple "ab", alors cela voudra dire que c'est la fin.
Mécanisme primitif mais qui fonctionne tout le temps...
Marsh Posté le 27-09-2008 à 23:29:49
Sve@r a écrit : |
j'imagine que ça doit bien fonctionner mais je ne vois pas comment l'appliquer dans mon cas vu que j'envoie chaque phrase en entier dans le pipe et que je recois caractere par caractere ...
j'vais quand meme y reflechir et de toute facon je garde ta méthode en memoire pour quand j'en aurais besoin ; )
merci !
Marsh Posté le 27-09-2008 à 23:59:42
ReplyMarsh Posté le 28-09-2008 à 00:07:36
et dans le cas où ce ne sont pas 2 processus pere-fils (cad quand ils ne sont pas lancés dans le meme terminal) ??
Marsh Posté le 28-09-2008 à 13:15:04
ReplyMarsh Posté le 28-09-2008 à 14:08:15
matafan a écrit : C'est normal que tu ne teste pas le write avant de faire le perror ? |
c'est fait dans la derniere version
Marsh Posté le 28-09-2008 à 14:37:58
elldekaa a écrit : j'imagine que ça doit bien fonctionner mais je ne vois pas comment l'appliquer dans mon cas vu que j'envoie chaque phrase en entier dans le pipe et que je recois caractere par caractere ... |
Ben tu traites la phrase avant de l'envoyer et à la réception tu gères un cas particulier si tu reçois le caractère "a" (dans l'exemple "ab" )...
elldekaa a écrit : et dans le cas où ce ne sont pas 2 processus pere-fils (cad quand ils ne sont pas lancés dans le meme terminal) ?? |
L'envoi d'un signal (kill()) marche aussi même sur des processus non liés père/fils. Faut juste que le processus qui envoie le signal connaisse le pid du processus cible (et aussi qu'il soit le propriétaire)...
Marsh Posté le 29-09-2008 à 09:30:53
Je vais peut-être dire une connerie (enfin je pense pas, mais bon), mais pour ton histoire de fermeture je ne comprend pas trop le problème. Quand le producteur détecte une ligne vide, il close() le pipe. Ca aura pour effet d'arrêter la lecture dans le consomateur (read() retourne 0).
Envoyer un truc spécial dans le pipe, ça ne se justifie que si tu veux une "connexion" persistante.
Marsh Posté le 27-09-2008 à 14:45:38
Bonjour,
Je dois ecrire une programme qui lance 2 processus : 1 qui lit qq chose au clavier et qui l'envoie par la pipe (write) et l'autre qui recupere les caracteres a la sortie (read) et qui les affiche a l'ecran...
j'ai le droit à cette magnifique erreur :
Erreur (write): : Invalid or incomplete multibyte or wide character
Erreur (read): : Illegal seek
Erreur (read): : Invalid or incomplete multibyte or wide character
Erreur (read): : Invalid or incomplete multibyte or wide character
Erreur (read): : Invalid or incomplete multibyte or wide character
que je ne comprends pas trop ... donc si quelqu'un aurait une idee ...
merci d'avance