.NET9 Linux-x64下Console.WriteLine原理
1.前言
之前聊过Windows下面Console.WriteLine的运行过程常用Console.WriteLine原理,你知道吗?本篇看下它在Linu-x64下面最新.NET9运行过程
2.托管代码
在.NET中,通常使用StreamReader和StreamWriter这两个类来进行流读写操作,它们的命名空间位于System.IO中。这些类包含在托管库System.Runtime.dll中。下面是一个简单的示例操作:
using (StreamWriter writer = File.CreateText("newfile.txt")) { await writer.WriteLineAsync("First line of example"); await writer.WriteLineAsync("and second line"); }
StreamWriter和StreamReader分别派生自TextWriter和TextReader。Console.WriteLine打印出的字符串,则是在CLR库里面直接通过TextWriter写入到的数据流/设备。
比如例子:
static void Main(string[] args) { Console.WriteLine("Call Main"); }
Console.WriteLine会调用Out.EnsureInitialized函数,Out即是TextWriter类型,代码如下:
源码地址: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; } } } }
EnsureInitialized函数里面调用了Volatile.Write函数,Volatile.Write函数的意思是,把参数二的值写入到参数一字段里面去。这里的解释就是把CreateOutputWriter(ConsolePal.OpenStandardOutput())返回的值写入s_out字段,s_out也是TextWriter类型。
这里看下CreateOutputWriter(ConsolePal.OpenStandardOutput())返回的值是啥。CreateOutputWriter函数如下:
源码地址: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 }); }
可以看到CreateOutputWriter返回的依旧是TextWriter,也就是说Volatile.Write把流数据写入到流数据,然后从设备上打印出来。
这里写入的流数据值到底是什么呢?继续看ConsolePal.OpenStandardOutput()函数,它返回的是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); }
这里是Linux/Unix下面的操作,OpenStandardOutput里面实例化了一个UnixConsoleStream类,UnixConsoleStream的构造函数里面,第一个参数是Interop.CheckIo(Interop.Sys.Dup(Interop.Sys.FileDescriptors.STDOUT_FILENO))。Interop.Sys.Dup是Linux下面进行文件表项操作的函数。CheckIo则是个检查函数,此处可以忽略。
举个例子,一般的来说Linux下面在终端打印一个hello World通常通过printf(“hello Word”)
printf -> stdout(标准输出) -> Dup(STDOUT_FILENO) ->终端输出
可见Linux下面是通过Dup函数传递参数STDOUT_FILENO进行终端操作的,UnixConsoleStream第二个参数是FileAccess.Write,表示写入字符串。然后把这个Stream封装后返回,通过Volatile.Write写入到终端流里面打印出来。
那么其实很清晰了,流程大致如下:
Console.WriteLine ->Out.EnsureInitialized -> ConsolePal.OpenStandardOutput() -> I
以上是.NET9 Linux-x64下Console.WriteLine原理的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

任天堂已开放最新版本 Switch Lite 的预订(亚马逊售价 189.99 美元)。不过,该设备目前还无法在全球范围内订购。回顾一下,该公司在大约两周前推出了 Switch Lite Hyrule 版

console是控制台的意思,是一种与计算机系统进行交互的设备或软件,用于与计算机系统进行交互,它通常是一个带有键盘和屏幕的设备,用于输入和输出信息,控制台最初用于大型计算机系统,后来也应用于个人计算机和服务器,它可以帮助用户管理和维护计算机系统,以及安装操作系统和应用程序,调试程序等。

使用C#中的Console.Clear函数清空控制台输出在C#的控制台应用程序中,我们经常需要清空控制台中的输出信息,以便于显示新的内容或者提供更好的用户体验。C#中提供了Console.Clear函数来实现这个功能,它能够清除控制台中的输出,让界面重新变为空白。Console.Clear函数的调用格式如下:Console.Clear();该函数无需输入任何

任天堂昨天在最近的任天堂直面活动中展示了大量游戏,我们单独提供了概述。此外,该公司还发布了新版本的 Switch Lite(亚马逊售价 194.93 美元),可能是

如果您最近购买了 MagicX XU Mini M,这个消息可能会让您感到惊讶。对新发布的手持式游戏机的硬件和软件拆解显示,广告中的 RK3562 CPU 实际上是规格较低、较旧的 RK3326 处理器。

console是控制台,计算机程序中用于输入和输出文本或命令的交互界面,在不同的操作系统和开发环境中,控制台可能具有不同的外观和功能。通常是一个文本界面,提供了一个命令行界面或命令行提示符,允许用户通过键盘输入命令,并显示程序的输出结果。

上周,知名游戏业内人士 Paul Gele 表示,即将推出的 Nintendo Switch 2 将在发布时获得主要的第三方 AAA 端口。这是值得期待的事情,因为第一代游戏掌机在发布时没有获得任何 AAA 游戏。乙

console接口是一种用于在计算机命令行或浏览器开发工具中输出信息的工具,提供了一种简单的方式来记录和查看应用程序的输出结果和调试信息。通过使用console接口,开发人员能够更有效地识别和解决问题,优化应用程序性能,提高开发效率。无论是在命令行还是浏览器开发工具中,console接口都是不可或缺的工具。
