• [^] # Re: simple

    Posté par . En réponse au message Écriture différée de &> log. Évalué à 8.

    Attention, le comportement observé n'a rien avoir avec les buffer/page caches, c'est une histoire de bufferisation : avec la libc, il y a trois types de bufferisation :
    - _IONBF : pas de bufferisation, on appelle tout de suite l'appel système write
    - _IOLBF : bufferisation par ligne, on appelle write lorsqu'on rencontre '\n', utilisée par défaut lorsque le descripteur de fichier est lié à un tty (sauf stderr qui est _IONBF)
    - _IOFBF : bufferisation complète, on bufferise jusqu'à ce que le buffer soit plein, utilisé par défaut pour les fichiers, les pipes, etc

    Même sans bufferisation, une écriture via printf/fwrite n'entraine pas forcément un accès au disque, le noyau utilise le page cache pour des questions de performance. Pour forcer l'écriture sur disque (commit), il faut passer un un fflush pour flusher le buffer au niveau de la libc, mais aussi un fsync pour forcer un commit des données en cache.
    Entre autres choses, la bufferisation au niveau de la libc permet de réduire le nombre d'appels systèmes, qui coutent cher.

    La grosse différence c'est que tant qu'il y a des données bufferisées au niveau de la libc (FILE *), les modifications ne sont pas visibles par les autres processus. Par contre dès que write(2) est appelé, elles deviennent visibles.