成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

.NET9 Linux-x64下Console.WriteLine原理

系統(tǒng) Linux
StreamWriter和StreamReader分別派生自TextWriter和TextReader。Console.WriteLine打印出的字符串,則是在CLR庫里面直接通過TextWriter寫入到的數(shù)據(jù)流/設(shè)備。

1.前言

之前聊過Windows下面Console.WriteLine的運行過程常用Console.WriteLine原理,你知道嗎?本篇看下它在Linu-x64下面最新.NET9運行過程

2.托管代碼

.NET里面流讀寫數(shù)據(jù)一般都是通過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寫入到的數(shù)據(jù)流/設(shè)備。

比如例子:

static void Main(string[] args)
{
   Console.WriteLine("Call Main");
}

Console.WriteLine會調(diào)用Out.EnsureInitialized函數(shù),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函數(shù)里面調(diào)用了Volatile.Write函數(shù),Volatile.Write函數(shù)的意思是,把參數(shù)二的值寫入到參數(shù)一字段里面去。這里的解釋就是把CreateOutputWriter(ConsolePal.OpenStandardOutput())返回的值寫入s_out字段,s_out也是TextWriter類型。

這里看下CreateOutputWriter(ConsolePal.OpenStandardOutput())返回的值是啥。CreateOutputWriter函數(shù)如下:

源碼地址: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把流數(shù)據(jù)寫入到流數(shù)據(jù),然后從設(shè)備上打印出來。

這里寫入的流數(shù)據(jù)值到底是什么呢?繼續(xù)看ConsolePal.OpenStandardOutput()函數(shù),它返回的是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的構(gòu)造函數(shù)里面,第一個參數(shù)是Interop.CheckIo(Interop.Sys.Dup(Interop.Sys.FileDescriptors.STDOUT_FILENO))。Interop.Sys.Dup是Linux下面進(jìn)行文件表項操作的函數(shù)。CheckIo則是個檢查函數(shù),此處可以忽略。

舉個例子,一般的來說Linux下面在終端打印一個hello World通常通過printf("hello Word")

printf -> stdout(標(biāo)準(zhǔn)輸出) -> Dup(STDOUT_FILENO) ->終端輸出

可見Linux下面是通過Dup函數(shù)傳遞參數(shù)STDOUT_FILENO進(jìn)行終端操作的,UnixConsoleStream第二個參數(shù)是FileAccess.Write,表示寫入字符串。然后把這個Stream封裝后返回,通過Volatile.Write寫入到終端流里面打印出來。

那么其實很清晰了,流程大致如下:

Console.WriteLine ->Out.EnsureInitialized -> ConsolePal.OpenStandardOutput() -> I
責(zé)任編輯:武曉燕 來源: 江湖評談
相關(guān)推薦

2024-02-19 00:00:00

Console函數(shù)鏈接庫

2024-03-11 10:21:53

.NET9調(diào)用FCall

2024-11-27 13:17:21

2025-05-07 07:23:26

2024-12-09 00:00:06

2009-06-25 09:03:42

Linux

2024-11-20 16:02:47

.NET 9LINQ開發(fā)

2009-12-17 10:05:07

LinuxdtAgeiaPhys

2023-09-21 08:46:44

操作系統(tǒng)windows 10內(nèi)存

2025-03-05 10:00:00

.NET 9C#開發(fā)

2025-01-03 08:29:53

2025-03-03 00:48:12

微軟.NET 9Java

2025-03-03 02:25:00

.NET 9JSON序列化

2025-04-16 04:22:00

2025-02-06 13:57:26

2024-02-20 08:40:08

.NET 9智能應(yīng)用開發(fā)

2009-08-27 10:31:36

ChromiumLinux64位程序

2009-03-04 09:10:53

Windows 7Beta7048x64和703

2012-03-02 09:32:33

Linux桌面系統(tǒng)

2023-09-25 10:29:21

CPUAArch64x86_64
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲欧美在线观看 | 永久看片 | 一区二区三区高清 | 国产精品一区二区三区久久 | 亚洲精品视频在线播放 | 精品国产aⅴ | 欧美日韩精品久久久免费观看 | 婷婷激情在线 | 爱综合| 亚洲精品国产电影 | 国产精品永久免费视频 | av免费网址 | 日韩精品一区二区三区视频播放 | 日本韩国欧美在线观看 | 99re在线视频观看 | 一区二区免费看 | 四虎成人免费电影 | 一区二区三区中文字幕 | 亚洲第一在线 | 亚洲视频三区 | 日韩欧美国产成人一区二区 | www.久久久.com| 久久91精品国产一区二区 | 久久精品国产亚洲一区二区 | 亚洲精品一区二区三区四区高清 | 国产福利观看 | 欧美黄 片免费观看 | 亚洲精品久久久一区二区三区 | 国产精品视频一区二区三区四蜜臂 | 欧美电影一区 | 中文字幕精品一区 | 粉嫩粉嫩芽的虎白女18在线视频 | 一级a性色生活片久久毛片 一级特黄a大片 | 亚洲逼院| 欧美在线免费 | 国产福利视频导航 | 亚洲精品成人网 | 亚洲网站观看 | 欧美日本韩国一区二区 | 精品国产伦一区二区三区观看体验 | 午夜在线小视频 |