1.
J'ai déjà parlé des principes communs de Console.WriteLine dans le processus d'exécution de Console.WriteLine sous Windows. Le savez-vous ? Cet article examine son dernier processus en cours d'exécution .NET9 sous Linux-x64
2. Code géré
Dans .NET, les deux classes StreamReader et StreamWriter sont généralement utilisées pour les opérations de lecture et d'écriture de flux, et leurs espaces de noms sont situés dans System.IO. Ces classes sont incluses dans la bibliothèque gérée System.Runtime.dll. Voici un exemple d'opération simple :
using (StreamWriter writer = File.CreateText("newfile.txt"))
{
await writer.WriteLineAsync("First line of example");
await writer.WriteLineAsync("and second line");
}
Copier après la connexion
StreamWriter et StreamReader sont respectivement dérivés de TextWriter et TextReader. La chaîne imprimée par Console.WriteLine est le flux de données/périphérique écrit directement via TextWriter dans la bibliothèque CLR.
Par exemple :
static void Main(string[] args)
{
Console.WriteLine("Call Main");
}
Copier après la connexion
Console.WriteLine appellera la fonction Out.EnsureInitialized. Out est le type TextWriter. Le code est le suivant :
源码地址:https://github.com/dotnet/runtime/blob/main/src/libraries/System.Console/src/System/Console.cs
public static TextWriter Out
{
get
{
static TextWriter EnsureInitialized()
{
lock (s_syncObject)
{
if (s_out == null)
{
Volatile.Write(ref s_out, CreateOutputWriter(ConsolePal.OpenStandardOutput()));
}
return s_out;
}
}
}
}
Copier après la connexion
La fonction EnsureInitialized appelle la fonction Volatile.Write. La fonction Volatile.Write signifie écrire la valeur du paramètre deux dans le champ du paramètre un. L'explication ici est d'écrire la valeur renvoyée par CreateOutputWriter(ConsolePal.OpenStandardOutput()) dans le champ s_out. s_out est également un type TextWriter.
Voici la valeur renvoyée par CreateOutputWriter(ConsolePal.OpenStandardOutput()). La fonction CreateOutputWriter est la suivante :
源码地址:https://github.com/dotnet/runtime/blob/main/src/libraries/System.Console/src/System/Console.cs
private static TextWriter CreateOutputWriter(Stream outputStream)
{
return outputStream == Stream.Null ?
TextWriter.Null :
TextWriter.Synchronized(new StreamWriter(
stream: outputStream,
encoding: OutputEncoding.RemovePreamble(),
bufferSize: WriteBufferSize,
leaveOpen: true)
{
AutoFlush = true
});
}
Copier après la connexion
Vous pouvez voir que CreateOutputWriter renvoie toujours TextWriter, ce qui signifie que Volatile.Write écrit des données de flux pour diffuser des données, puis les imprime à partir de l'appareil.
Quelle est la valeur des données de flux écrite ici ? Continuez à regarder la fonction ConsolePal.OpenStandardOutput(), qui renvoie un type Stream.
源码地址:
https://github.com/dotnet/runtime/blob/main/src/libraries/System.Console/src/System/ConsolePal.Unix.cs
public static Stream OpenStandardOutput()
{
return new UnixConsoleStream(Interop.CheckIo(Interop.Sys.Dup(Interop.Sys.FileDescriptors.STDOUT_FILENO)), FileAccess.Write);
}
Copier après la connexion
Voici les opérations sous Linux/Unix. Une classe UnixConsoleStream est instanciée dans OpenStandardOutput. Dans le constructeur d'UnixConsoleStream, le premier paramètre est Interop.CheckIo(Interop.Sys.Dup(Interop.Sys.FileDescriptors.STDOUT_FILENO)). Interop.Sys.Dup est une fonction sous Linux qui effectue des opérations de saisie de tables de fichiers. CheckIo est une fonction de vérification et peut être ignorée ici.
Par exemple, de manière générale, sous Linux, l'impression d'un hello World sur le terminal se fait généralement via printf (« hello Word »)
printf -> stdout(标准输出) -> Dup(STDOUT_FILENO) ->终端输出
Copier après la connexion
On peut voir que sous Linux, le paramètre STDOUT_FILENO est passé via la fonction Dup pour les opérations du terminal. Le deuxième paramètre d'UnixConsoleStream est FileAccess.Write, ce qui signifie écrire une chaîne. Encapsulez ensuite ce Stream et renvoyez-le, écrivez-le dans le flux du terminal via Volatile.Write et imprimez-le.
Ensuite, c’est en fait très clair. Le processus est à peu près le suivant :
Console.WriteLine ->Out.EnsureInitialized -> ConsolePal.OpenStandardOutput() -> I
Copier après la connexion
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!