自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

.NET9 Linux-x64下Console.WriteLine原理

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

1.前言

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

2.托管代碼

.NET里面流讀寫數(shù)據(jù)一般都是通過(guò)StreamReader和StreamWriter這兩個(gè)類操作。它們命名空間在:System.IO。托管庫(kù):System.Runtime.dll,比如以下簡(jiǎn)單的操作小例子:

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庫(kù)里面直接通過(guò)TextWriter寫入到的數(shù)據(jù)流/設(shè)備。

比如例子:

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

Console.WriteLine會(huì)調(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,也就是說(shuō)Volatile.Write把流數(shù)據(jù)寫入到流數(shù)據(jù),然后從設(shè)備上打印出來(lái)。

這里寫入的流數(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里面實(shí)例化了一個(gè)UnixConsoleStream類,UnixConsoleStream的構(gòu)造函數(shù)里面,第一個(gè)參數(shù)是Interop.CheckIo(Interop.Sys.Dup(Interop.Sys.FileDescriptors.STDOUT_FILENO))。Interop.Sys.Dup是Linux下面進(jìn)行文件表項(xiàng)操作的函數(shù)。CheckIo則是個(gè)檢查函數(shù),此處可以忽略。

舉個(gè)例子,一般的來(lái)說(shuō)Linux下面在終端打印一個(gè)hello World通常通過(guò)printf("hello Word")

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

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

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

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

2024-02-19 00:00:00

Console函數(shù)鏈接庫(kù)

2024-03-11 10:21:53

.NET9調(diào)用FCall

2024-11-27 13:17:21

2024-12-09 00:00:06

2009-06-25 09:03:42

Linux

2009-12-17 10:05:07

LinuxdtAgeiaPhys

2024-11-20 16:02:47

.NET 9LINQ開(kāi)發(fā)

2023-09-21 08:46:44

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

2025-01-03 08:29:53

2025-03-05 10:00:00

.NET 9C#開(kāi)發(fā)

2025-04-16 04:22:00

2025-03-03 00:48:12

微軟.NET 9Java

2025-03-03 02:25:00

.NET 9JSON序列化

2009-03-04 09:10:53

Windows 7Beta7048x64和703

2009-08-27 10:31:36

ChromiumLinux64位程序

2012-03-02 09:32:33

Linux桌面系統(tǒng)

2021-10-15 10:24:04

Windows 11操作系統(tǒng)微軟

2023-09-25 10:29:21

CPUAArch64x86_64

2021-06-07 15:20:22

Linux X861MB內(nèi)存BIOS

2025-02-06 13:57:26

點(diǎn)贊
收藏

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