Salut à tous,
J'ai un petit problème concernant une application que je suis en train de développer. Je précise que je suis tout frais dans le mode du C.
Le principe est assez simple, le voici :
Je fais un appel à pipe() pour créer un tube, puis j'utilise fork() après avoir correctement redirigé les entrées et sorties standards pour que le fils puisse lancer l'application ctags. ctags lira les fichier à traiter dans son entrée standard pendant que le père enverra les fichiers sur sa (celle du père), sortie standard. Voici le principe en bouts de code (Je précise que j'ai tout écrit à la main donc si il y'a des erreurs de syntaxe il s'agit simplement de faute de frappe. Tout A L'AIR de bien fonctionner, ctags crée et remplie bien le fichier de tags)
Tout marche bien, le ctags me sort bien un fichier de tags Seulement voilà la fonction en question dans le père est sensée écrire un EOF dans le tube (sa sortie standard). Ce que je fais avec un fwrite(stdout, "%d", stdout) car j'ai lu que fputc() convertit de façon transparente un entier, quel qu'il soit, en caractère (Je débute encore en C et ces notions sont encore un peu vague pour moi donc dans le doute...!). Puis la "fonction père" ferme sa sortie standard (ce que je fais avec un close() ).
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 int * tube; if(pipe(tube)){ [...] } switch(fork()){ [...] case 0: close(tube[1]); dup2(tube[0], STDIN_FILENO); [ ... <lance "ctags -L -" avec execvp() pour lire l entrée standard> ... ]; default: close(tube[0]); dup2(tube[1], STDOUT_FILENO); [ ... <lance la fonction qui ecrit les fichier à traiter dans la sortie standard!> ... ] } [ <le reste traite normalement avec stdin et stdout> ]
Mon problème est que lorsque j'envoie le EOF dans stdout et même quand je ferme mon stdout dans le père, le ctags reste quand même bloqué et attend encore d'autres noms de fichiers.
Alors voici ma question, y'a-t-il un moyen genre un attribut du pipe, portable si possible, que je pourrais changer pour que le EOF soit transmis directement au fils? Bien sûr j'ai posé ma question en étant sûr que çà vient de là mais je débute vraiment en C alors si je me gourre n'hésitez pas à me lyncher! A ce propos d'ailleurs je précise que j'ai fais un test en envoyant, juste pour tester, un nombre de EOF correspondant à la taille d'un buffer pour les pipe mais là ctags m'affiche je ne sais combien de fois un caractère bizarre avant de me dire que le nom de fichier est trop long.
Donc j'en profite pour poser une deuxième question histoire d'être sûr :
Mon caractère EOF (-1 sur mon système linux), est-il bien passé tel quel à la sortie standard?? Et de façon plus générale quelle serait la meilleure fonction pour écrire des données "brutes" dans ce genre de situation sans formattage par fprintf et autres??
Partager