Maison  >  Article  >  tutoriels informatiques  >  Principe de Console.WriteLine sous .NET9 Linux-x64

Principe de Console.WriteLine sous .NET9 Linux-x64

WBOY
WBOYavant
2024-02-23 09:04:10604parcourir

.NET9 Linux-x64下Console.WriteLine原理

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");
}
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");
}

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;
}
}
}
}

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
});
}

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);
}

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) ->终端输出

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

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer