首页 电脑教程 电脑知识 .NET9 Linux-x64下Console.WriteLine原理

.NET9 Linux-x64下Console.WriteLine原理

Feb 23, 2024 am 09:04 AM
writer console

.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中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

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

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

全新 Nintendo Switch Lite 更新现已开放预订 全新 Nintendo Switch Lite 更新现已开放预订 Jun 29, 2024 am 06:49 AM

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

console什么意思 console什么意思 Sep 05, 2023 pm 02:43 PM

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

使用C#中的Console.Clear函数清空控制台输出 使用C#中的Console.Clear函数清空控制台输出 Nov 18, 2023 am 11:00 AM

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

任天堂在 Switch 2 发布前宣布更新 Switch Lite 任天堂在 Switch 2 发布前宣布更新 Switch Lite Jun 20, 2024 am 09:41 AM

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

MagicX XU Mini M:拆解显示 RK3326 CPU 而不是广告中的 RK3562,MagicX 断绝与第三方开发者的联系 MagicX XU Mini M:拆解显示 RK3326 CPU 而不是广告中的 RK3562,MagicX 断绝与第三方开发者的联系 Sep 01, 2024 am 06:30 AM

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

console是什么意思 console是什么意思 Aug 09, 2023 pm 04:21 PM

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

据传 Nintendo Switch 2 将移植《刺客信条:暗影》以及该系列之前的作品 据传 Nintendo Switch 2 将移植《刺客信条:暗影》以及该系列之前的作品 Aug 14, 2024 pm 12:36 PM

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

console接口是什么 console接口是什么 Aug 08, 2023 am 11:15 AM

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

See all articles