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

.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删除
Zoho邮件登录/注册| Zoho Mail应用程序下载-MinitoolZoho邮件登录/注册| Zoho Mail应用程序下载-MinitoolApr 23, 2025 am 12:51 AM

这篇文章主要介绍Zoho邮件。了解如何注册Zoho邮件并登录您的Zoho邮件帐户,以使用此电子邮件服务来查看和管理您的个人或业务电子邮件。

如何在Microsoft Excel中显示或隐藏公式? -  Minitool如何在Microsoft Excel中显示或隐藏公式? - MinitoolApr 23, 2025 am 12:50 AM

想在Excel中显示公式吗?想在Excel中隐藏公式吗?从事这些工作并不难。 PHP.CN软件收集了一些有用的方法,并在这篇文章中显示了它们。此外,如果要恢复丢失的Excel文件,可以尝试使用PHP

现在Google可以将一个VPN下载到Windows和Mac供使用-Minitool现在Google可以将一个VPN下载到Windows和Mac供使用-MinitoolApr 23, 2025 am 12:49 AM

Google提供免费VPN吗?什么是Google一个VPN?您是否使用Google One获得VPN?在这篇文章中,PHP.CN将向您展示有关此VPN服务的信息。此外,您可以下载Google for Desktop(Windows&MacOS)以访问IN

如何修复'内部硬盘驱动器保持断开Windows 10”?如何修复'内部硬盘驱动器保持断开Windows 10”?Apr 23, 2025 am 12:48 AM

您是否正在为“内部硬盘驱动器保持断开Windows 10”问题而苦苦挣扎?此相关问题的原因有很多,您可以在PHP.CN网站上阅读此帖子,以详细解决故障排除措施并弄清楚其Trigg

如何修复FIFA 22在Windows 10/11上崩溃? -  Minitool如何修复FIFA 22在Windows 10/11上崩溃? - MinitoolApr 23, 2025 am 12:47 AM

FIFA 22/21是一款受欢迎的游戏,没有足球迷可以抵抗它。但是,由于某些原因,您将无法享受游戏。您可能遇到的最常见问题之一是FIFA 22/21在PC上崩溃。如果您的FIFA 22保持

如何修复Hulu缺少情节?尝试这些修复程序! -  Minitool如何修复Hulu缺少情节?尝试这些修复程序! - MinitoolApr 23, 2025 am 12:46 AM

你们中的一些人发现,Hulu在打算观看一些视频时不会播放某些节目。为了解决Hulu丢失的情节,我们在PHP.CN网站上为您解决了一些潜在的原因和可行的解决方案。如果你也很困扰我

如何下载和安装Windows的Google Drive -Minitool如何下载和安装Windows的Google Drive -MinitoolApr 23, 2025 am 12:45 AM

Google Drive为Windows和Mac提供应用程序。使用Google Drive桌面应用程序,您可以更轻松地同步文件。这篇来自Php.cn的帖子向您展示了如何下载,安装和使用Windows的Google Drive。

如何修复Windows 10/11上超级人员检测到的加载滞后? -  Minitool如何修复Windows 10/11上超级人员检测到的加载滞后? - MinitoolApr 23, 2025 am 12:43 AM

超人是Wonder Games发布的最新战斗皇家游戏之一,您可以在Steam客户端免费下载它。当您玩此游戏时,您可能会遇到超级人物滞后,低FP和口吃问题。幸运的是

See all articles

热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

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

热工具

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

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

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版