l0g4n Expert en tout :o | 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
Code :
- #include <stdlib.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <pthread.h>
- #include <string.h>
- void* send_patch_via_tftp(void* datab)
- {
- pid_t pid;
- int rv;
- int commpipe[2];
- char IP_to_patch[16];
- strcpy(IP_to_patch, datab);
- if(pipe(commpipe))
- {
- // En cas de problème avec la création du pipe, on coupe tout
- fprintf(stderr, "Pipe error !\n" );
- exit(1);
- }
- if( (pid=fork()) == -1)
- {
- // On coupe tout si le fork échoue.
- fprintf(stderr, "Fork error, Exit.\n" );
- exit(1);
- }
- if(pid)
- {
- /* Process père */
- dup2(commpipe[1],1); /* Remplacement de stdout avec une des entée du pipe vers tftp */
- close(commpipe[0]); /* On ferme l'autre coté */
- setvbuf(stdout,(char*)NULL,_IONBF,0); /* sortie stdout non bufferisee */
- sleep(1); // Les sleeps sont là pour n'écrire que quand tftp est prêt. A voir si c'est 1) réductible 2)Suppressible
- printf("put /opt/armur/patch patch\n" ); // On envoie la commande, toute simple, à tftp, via le pipe
- sleep(1); // Idem ci-dessus
- printf("quit\n" ); // Ah, oui, si celle-ci ne passe pas, ça laisse des zombies de partout, c'est crade.
- wait(&rv); /* On attend le retour de tftp */
- }
- else
- {
- /* Process enfant */
- dup2(commpipe[0],0); /* on remplace stdin avec l'autre coté du pipe */
- close(commpipe[1]); /* On ferme le premier coté du pipe */
- execl("/usr/bin/tftp","/usr/bin/tftp",IP_to_patch,(char*) 0);
- }
- pthread_exit(NULL);
- }
- int main(int argc, char *argv[])
- {
- char IP_1[16] = "10.0.0.201";
- char IP_2[16] = "10.0.0.202";
- char IP_3[16] = "10.0.0.203";
- char IP_4[16] = "10.0.0.204";
- pthread_t thread_1;
- pthread_t thread_2;
- pthread_t thread_3;
- pthread_t thread_4;
- pthread_create(&thread_1, NULL,send_patch_via_tftp, IP_1);
- pthread_create(&thread_2, NULL,send_patch_via_tftp, IP_2);
- pthread_create(&thread_3, NULL,send_patch_via_tftp, IP_3);
- pthread_create(&thread_4, NULL,send_patch_via_tftp, IP_4);
- pthread_join(thread_1, NULL);
- pthread_join(thread_2, NULL);
- pthread_join(thread_3, NULL);
- pthread_join(thread_4, NULL);
- }
|
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.
|