Pipe, fork et pthread, agrémentés de tftp... [résolu] - C - Programmation
Marsh Posté le 27-01-2012 à 21:49:52
Désolé, je n'ai pas de linusque sous la main, mais il y a un truc qui me parait pas bien dans ton code (outre le fait que tu as sans doute dû oublié les lignes pour initialiser commpipe[] et pid):
Code :
|
Là tu remplaces la sortie standard du processus père, processus où sont présent tous les threads qui envoient les commandes. Comme commpipe[1] est différent pour chaque thread, certains thread vont écrire dans le vide et les processus fils risquent d'attendre indéfiniment. Bref je regarderais du coté de la fonction fdopen() pour éviter de réassigner stdout.
Marsh Posté le 27-01-2012 à 22:40:07
tpierron a écrit : Désolé, je n'ai pas de linusque sous la main, mais il y a un truc qui me parait pas bien dans ton code (outre le fait que tu as sans doute dû oublié les lignes pour initialiser commpipe[] et pid): |
Oups, oui, manque un bout du code, j'ai trop simplifié Si ça peut te rassurer, ils sont bien présents dans mon code original
J'édit le premier post
tpierron a écrit :
|
Ah mais c'est pas con ! J'avais juste pas du tout vu ça comme ça, je pensait un thread == un père/fils == un stdin/stdout/stderr...
Je vais jeter un coup d'oeuil à fdopen... Si en plus, ça peut m'éviter de forker
EDIT : ai jeté un coup d'oeuil à fdopen, et la pluspart de la doc que je trouve dessus dis "fdopen associe un flux à l'identificateur de fichier obtenu par un appel préalable à creat, dup, dup2 ou open.", donc en gros, il fait la même chose que moi avec dup2 et pipe ?
Bref, je continus à creuser, mais je suis pas sur de creuser dans la bonne direction...
EDIT 2 : Je suis parvenus à remplacer la modification de stdout par un flux, via fdopen et pipe et, si tout se passe comme je le pense, mes données arrivent bien de l'autre coté de mon pipe, dans mon child...
Sauf que du coup, maintenant, je voudrais faire en sorte que execl redirige ce qui vas sortir de mon pipe vers le stdin du process qu'il lance ?! Sans utiliser dup2 donc ?! Sauf que je n'ai qu'un stdin pour tout mes threads
J'ai déjà passé pas mal de temps sur ce soft, et cette partie précise me donne du fil à retordre, je crois que j'ai plus les idées très claires
Marsh Posté le 28-01-2012 à 00:24:59
Problème résolu, j'ai remplacé toute ma fonction send_patch_via_tftp par :
Code :
|
Et celà fonctionne, même sur plusieurs threads...
Faut que je vois si ça fonctionne en supprimant les sleeps, mais le principale est que ça tourne, que ça facilite grandement mon code (je n'avais pas besoin du fork, mais uniquement des threads, ils étaient là car je n'ai pas su trouver solutions plus élégante, c'est chose faite.).
Merci tpierron, c'est en farfouillant dans les liens des pages de doc de fdopen que j'ai finis sur popen
Marsh Posté le 27-01-2012 à 17:55:38
Bonjour,
Je cherche aujourd'hui à manipuler tftp (sous linusk), en le lançant dans l'enfant d'un fork (via exec), et en lui envoyant des commandes (put, exit), depuis le père.
Cela semble fonctionner...
Cependant, lorsque j'essaie de lancer plusieurs fois ce processus en simultané, via pthread, je me heurte à un écueil. Je trouve, sur ma sortie standard, des "tftp> ?Invalid command" qui apparaissent...
Je vous copie-colle ci-dessous le code compilable (au final, c'est une simplification du code d'origine, mais le problème se pose toujours).
Pensez à utiliser l'options "-lpthread" de gcc
Ceci n'est pas une aide au devoir, mais une incompréhension de ma part, merci à tout ceux qui apporteront une piste de réflexion
Bien entendus, toutes les machines (10.0.0.201-204) disposent d'un serveur tftp fonctionnel, à l'écoute, sur un port standart, etc...
Message édité par l0g4n le 28-01-2012 à 00:25:14
---------------
Fort et motivé. Sauf parfois.