天天看點

write系統調用的實作 (你想知道的C語言 1.3)

Q: 承接printf的底層實作,write系統調用是否就是寫到stdout檔案最後傳遞給LCD驅動顯示?

A: write系統調用确實會把資料寫到kernel stdout buffer, 但不會直接傳遞給LCD驅動顯示.

    這也是write系統調用和很多驅動實作不同的地方,很多驅動是會直接丢給對應的硬體處理完成

  必要的任務, GUI作業系統對于write系統調用的處理卻很保守,這種保守并沒有錯. 對于核心來說,

  它并不知道資料真正要在哪個GUI應用程式中輸出,是以,核心隻會接收資料,然後喚醒"read線程",

  并讓"read線程"拿到write的資料,然後傳回給使用者GUI應用程式調用GUI API輸出資料.

    是以,不要小看了printf, 它沒有字面意義的那麼簡單.

Q: 為什麼在單使用者模式或者DOS系統, 根本沒有上面的描述這麼複雜?

A: 單使用者模式或者DOS系統,printf -> write -> show on screen 是一氣呵成的, 在這種模式下,并沒

有所謂的多GUI顯示問題,是以write内部就是調用BIOS調用或者LCD驅動顯示資料.

Q: printf -> write -> 喚醒"read線程" 到底是如何工作的?

A:    一般的作業系統都提供TTY架構,它提供了stdout/stdin的标準處理流程. 一種簡單的了解是,

每個程序都會打開自己的stdout/stdin, 注意,stdout/stdin對應核心内部會有tty結構體對應, 最開始

運作的終端會不斷用重定向的方式讓子程序stdout/stdin最終指向自己. 終端就是展示資料的作用,

實際資料都存在各程序的核心tty結構中. 對于如何喚醒"read線程", 終端會監測子程序的stdout/stdin

的資料, 有輸入就會按照指定方式顯示,當然預設是原碼展示. 核心會在stdout/stdin有資料時及時喚醒

終端"監測線程", 及時回報給終端做展示.

   例如, Mac平台iTerm2應用程式,是模拟終端的GUI應用程式,如下是輸入普通ascii字元輸入的流程.

write系統調用的實作 (你想知道的C語言 1.3)
write系統調用的實作 (你想知道的C語言 1.3)
write系統調用的實作 (你想知道的C語言 1.3)
作者:     陳曦
環境:     MacOS 10.14.5
         Apple LLVM version 10.0.1 (clang-1001.0.46.4)
         Target: x86_64-apple-darwin18.6.0
 
轉載請注明出處