Comme nous le savons, stdout est tamponné sous Linux. Ma question est la suivante: 1) Est-ce un tampon global partagé par tous les processus? ou un tampon pour chaque processus? 2) Où est le tampon? sur la pile ou le tas ou la zone statique? 3) Qui le crée? p>
3 Réponses :
Votre bibliothèque C et le noyau peuvent utiliser la tampon; Vous devrez vérifier les documentations individuelles. Je recommande de commencer par examiner la partie pertinente du code source de la bibliothèque C (c'est-à-dire la partie qui implémente stdout code> est un fichier C CODE> CORE CODE> Créé par la bibliothèque standard, le code correspondant est donc chargé dans le cadre de votre bibliothèque C. Sur Linux, il sera mis en œuvre en termes de descripteurs de fichier POSIX. P>
Meilleure ressource pour en savoir plus sur la bibliothèque standard C dans les détails d'escrupteur est PJ Plaudeur's La bibliothèque C standard C em> . Il décrit toutes les questions qui se sont posées lorsqu'il a mis en œuvre la bibliothèque par lui-même (en msword! Sur un ordinateur portable Win3.1! En vacances!).
Il donne également des informations détaillées sur la manière d'utiliser (et testez) toutes les fonctions. < / p>
pour le côté UNIX (Linux), vous devez commencer à lire sur 'Inode, qui est la structure de données classique pour stocker des fichiers mis en cache en mémoire. Le livre classique pour cela est la conception du système d'exploitation UNIX em> par Maurice J. Bach. P>
D'accord, maintenant que vous êtes précieusement grondé pour ne pas avoir lu tous les vieux livres et toutes les pages Wiki associées. P>
Voici une citation pertinente de la bibliothèque C standard C em>, p. 256. P> Vous pouvez, en principe, exercer une certaine quantité de contrôle sur la manière dont les fonctions d'E / S sont soumises à des données tampon pour un flux. Vous devez toutefois réaliser que la mise en mémoire tampon est une optimisation basée sur diverses conjectures sur les modèles d'E / S. Ces conjectures sont généralement correctes et de nombreuses implémentations suivent votre conseil. Mais ils n'ont pas à. Une implémentation est libre d'ignorer la plupart de vos demandes tampon. P>
Néanmoins, si vous pensez qu'un gros tampon améliorera les performances ou un tampon plus petit sauvera de l'espace, vous pouvez fournir votre propre tampon candidat. Appelez la fonction ... p>
... p>
blockQuote> Donc, au moins dans cette implémentation, le tampon par défaut vit probablement dans la structure de fichiers et est alloué sur le tas. Nous pouvons voir ici son frère, un tampon de caractère (
SETVBUF code> Après avoir ouvert le fichier et avant d'effectuer d'autres opérations sur le flux. (Évitez la fonction plus ancienne SETBUF code>, qui est moins flexible.) Vous pouvez spécifier si des E / S doivent être entièrement tamponnés, tamponnés par des lignes de texte ou non défectueuses. Cela pourrait faire une différence dans la performance de votre programme. P>
SETBUF code> - Utilisez SETVBUF code> au lieu de cette fonction pour obtenir plus de contrôle. P>
SETVBUF code> - En règle générale, il est préférable de laisser la bibliothèque C standard c Déterminer comment tamponner l'entrée / la sortie pour vous. Si vous êtes certain que vous ne voulez pas de mémoire tamponnage ou de mise en mémoire tampon à la fois, utilisez cette fonction pour initialiser correctement le courant. Call SETVBUF code> immédiatement em> après avoir ouvert le flux. Presque toute opération sur le flux préemptera votre droit de choisir une stratégie tampon. Si vous spécifiez votre propre tampon avec cet appel, ne supposez pas que le flux l'utilisera réellement. Et jamais em> modifier le contenu du tampon pendant que le flux est ouvert. Le mode strong> (troisième) argument doit avoir l'une des valeurs _iofbf code>, _IOLBF code> ou _ionbf code>, décrit ci-dessus. Voir également le macro bufsiz code>, décrit [ailleurs]. P>
str -> _ cbuf code>), est utilisé pour "nonuffered". P> p>
Cela dépend de la façon dont vous écrivez sur stdout. Si vous utilisez Voir aussi Si vous utilisez des routines de faible niveau comme < Code> écrire code> , seuls les octets donnés sont écrits. Selon la cible, il y aura la tampon dans le noyau. Si la cible est une TTY, elle peut être écrite directement sur le terminal. P> stdio code>, il s'agira de la ligne tamponnée, si la sortie va à la TTY. Sinon, il sera complètement tamponné. P>
homme stdio < / code> pour plus de détails. p>
Qu'est-ce que tu en as à faire?
Ma compréhension est qu'elle est créée par le noyau dans une zone de tas de noyau et est ensuite accessible via / dev / stdout.