[C UNIX] pipe bufferisé par défaut

pipe bufferisé par défaut [C UNIX] - Programmation

Marsh Posté le 05-05-2001 à 19:18:51    

J'utilise un pipe qui, par défaut, est bufferisé.
J'aimerais pouvoir l'utiliser sans qu'il soit bufferisé,
mais dans le man, il n'en est aucunement question.
Il est simplement dit qu'il est bufferisé par défaut.
 
Y a-t-il moyen de le rendre non-bufferisé,
ou y a-t-il un autre moyen de s'en sortir ?

Reply

Marsh Posté le 05-05-2001 à 19:18:51   

Reply

Marsh Posté le 05-05-2001 à 19:21:19    

pourquoi faire ?


---------------
Do androïds dream of electric sheep ?
Reply

Marsh Posté le 05-05-2001 à 19:23:07    

J'écris des données dans ce pipe,
mais je n'en écris pas beaucoup à la fois.
Cependant, j'aimerais pouvoir les lire au fur et à mesure que je les écris.
 
Comme le pipe est bufferisé, je dois attendre qu'il y en ai un certain nombre avant de pouvoir lire.

Reply

Marsh Posté le 05-05-2001 à 19:24:38    

hummhummm.
 
j'ai jeté un oeil sur popen , stdio etc.... et ils sont tous bufferisés....
 
je resume en imageant : tu veux un 'stream' ?


---------------
Do androïds dream of electric sheep ?
Reply

Marsh Posté le 05-05-2001 à 19:28:20    

En fait, comme je l'ai posté tout à l'heure,
j'utilise popen, sur la fonction tcpdump,
et je dois traiter les données que renvoit tcpdump.
 
Dans un process, j'analyse ce que me pond tcpdump,
afin de séparer chaque paquet, et je fous ça dans un pipe,
pour qu'un autre process puisse traiter les paquets.
 
Le problème, c'est que popen est bufferisé........ :cry:

Reply

Marsh Posté le 05-05-2001 à 19:28:52    

rattacher a un buffer d'une taille derisoire ?
 
 
SETBUF(3)          Manuel du programmeur Linux          SETBUF(3)
 
NOM
       setbuf, setbuffer, setlinebuf, setvbuf - Agir sur les buffers d'un flux.
 
SYNOPSIS
       #include <stdio.h>
 
       int setbuf (FILE *stream, char *buf);
       int setbuffer (FILE *stream, char *buf, size_t size);
       int setlinebuf (FILE *stream);
       int setvbuf (FILE *stream, char *buf, int mode , size_t size);
 
DESCRIPTION
       Les  trois  types  de  buffers  disponibles  sont les suivants : pas de buffers, buffers de blocs, et
       buffers de lignes.
 
       Quand un flux de sortie n'a pas de buffer, les données apparaissent dans le fichier  destination,  ou
       sur le terminal, dès qu'elles sont écrites.
 
       Avec  les  buffers  par  blocs, une certaine quantité de données est conservée avant d'être écrite en
       tant que bloc.
 
       Avec les buffers de lignes, les caractères sont conservés jusqu'à ce qu'un saut de ligne soit  trans­
       mis,  ou  que l'on réclame une lecture sur un flux attaché au terminal (typiquement stdin).  La fonc­
       tion fflush(3) peut être utilisée pour forcer l'écriture à n'importe quel moment.  (Voir  fclose(3).)
 
       Normalement  tous  les  fichiers  utilisent  des  buffers  de  blocs.  Quand  une  première opération
       d'entrée/sortie se déroule sur un fichier, malloc(3) est appelé, et un buffer est créé. Si le flux se
       rapporte  à  un terminal (comme stdout habituellement) il s'agit d'un buffer de ligne.  Le flux stan­
       dard de sortie d'erreur stderr n'a jamais de buffer par défaut.
 
       La fonction setvbuf peut être utilisée à tout moment sur n'importe quel flux ouvert pour modifier son
       type de buffer.  La paramètre mode doit correspondre à l'une des constantes symboliques suivantes :
 
              _IONBF pas de buffer
 
              _IOLBF buffer de ligne
 
              _IOFBF buffer complet
 
       A l'exception des fichiers sans buffers, l'argument buf doit pointer sur un buffer contenant au moins
       size octets. Ce nouveau buffer sera utilisé à la place de l'ancien.  Si l'argument buf est NULL, seul
       le  mode est affecté. Un nouveau buffer sera alloué automatiquement lors de la prochaine opération de
       lecture ou d'écriture.  La fonction setvbuf peut être utilisée à tout moment, mais ne peut changer le
       mode  que lorsque l'eventuel buffer précédent est inactif : avant la première opération d'entrée/sor­
       tie, ou immédiatement après un appel à fflush.
      Les 3 autres appels sont, en fait, simplement des alias pour l'appel de setvbuf.  la fonction  setbuf
       est exactement équivalente à
 
              setvbuf(stream, buf, buf ? _IOFBF : _IONBF, BUFSIZ);
 
       La  fonction setbuffer est identique, sauf que la taille du buffer est indiquée par l'appelant plutôt
       que la valeur par défaut BUFSIZ.  La fonction setlinebuf est exactement équivalente à :
 
              setvbuf(stream, (char *)NULL, _IOLBF, 0);
 
VOIR AUSSI
       fopen(3), fclose(3), fflush(3), fread(3), malloc(3), puts(3), printf(3)
 
CONFORMITÉ
       Les fonctions setbuf et setvbuf sont conformes à ANSI C3.159-1989 (``ANSI C'').
 
BUGS
       Les fonctions setbuffer et setlinebuf ne sont pas portables sur les systèmes BSD antérieurs à 4.2BSD,
       et  peut-être  indisponibles  sous Linux.  Sur les systèmes 4.2BSD et 4.3BSD, setbuf utilise toujours
       une taille de buffer non-optimale, et doit être évitée.
 
       Il faut toujours s'assurer que buf et son contenu existent encore au moment de la fermeture  du  flux
       (qui se produit automatiquement à la fin du programme).
 
       Par exemple, ceci est INCORRECT :
 
       #include <stdio.h>
 
       int
       main (void)
       {
           char   buf [BUFSIZ];
 
           setbuf (stdin, buf);
           printf ("Hello, world!\n" );
           return (0);
       }
 
TRADUCTION
       Christophe Blaess, 1997.
 
BSD                      7 Novembre 1996


---------------
Do androïds dream of electric sheep ?
Reply

Marsh Posté le 05-05-2001 à 19:43:53    

Merci pour ta réponse........mais bizarrement, ça ne fonctionne pas.
 
Enfin, je vais creuser un peu avant de dire que ça ne marche pas.
.....quoi, je l'ai dis ?

Reply

Marsh Posté le 05-05-2001 à 19:52:57    

modifier tcpdump pour qu'il ecrive d'une autre maniere :??:
 
ca me parait possible.  
juste une analogie :
j'avais modifié wget pour m'en faire un cgi : j'ai du modifier tous les appels d'affichage.
 
donc un pti coup d'oeil aux sorties de tcpdump serait peut etre interressant


---------------
Do androïds dream of electric sheep ?
Reply

Marsh Posté le 05-05-2001 à 20:44:32    

Tu parles de modifier les sources pour obtenir un autre affichage......??
 
Si même c'est pas ça, je vais un peu voir,
ça ne doit pas être trop difficile.

 

[edit]--Message édité par warp--[/edit]

Reply

Marsh Posté le 06-05-2001 à 10:37:38    

Ok, ça fonctionne,
j'ai d'abord utilisé setvbuf, mais ça n'a pas été.
Ensuite j'ai utilisé setbuffer sur le standard de sortie
setbuffer(stdout, &Buf, 1);
avant de créer le pipe.
Maintenant ça fonctionne.........
 
MERCI !!!!!!!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed