當你打開終端並輸入命令時會發生什麼?(上)

来源:https://www.cnblogs.com/edisonfish/archive/2023/12/13/17899745.html
-Advertisement-
Play Games

哈嘍大家好,我是鹹魚 參加過校招面試的小伙伴們肯定對下麵這道面試題很熟悉:“當你在瀏覽器輸入一段網址後會發生什麼?”。這道面試題可以說是很經典了,因為其涉及大量網路協議,可以非常直觀的看出小伙伴們對電腦網路體系的整體把握程度 但如果問題換成:“當你打開終端並輸入 ls 時會發生什麼?”,有多少小伙 ...


哈嘍大家好,我是鹹魚

參加過校招面試的小伙伴們肯定對下麵這道面試題很熟悉:“當你在瀏覽器輸入一段網址後會發生什麼?”。這道面試題可以說是很經典了,因為其涉及大量網路協議,可以非常直觀的看出小伙伴們對電腦網路體系的整體把握程度

但如果問題換成:“當你打開終端並輸入 ls 時會發生什麼?”,有多少小伙伴能夠回答出來呢?

終端的前世今生

大多數現代終端應用程式的工作方式都來自於其歷史前輩——電傳打字機(teletypes,簡稱 tty)

在大型電腦的時代,當時數據存儲在磁帶上,電腦的記憶體以 kB 為單位,電傳打字機就是為了它們而被設計出來

如上圖,左邊的是 IBM 2741電傳打字機,右邊是 IBM System/360 Mo. 40大型電腦

電傳打字機是允許用戶與電腦交互的基本文本客戶端。teletypes 其實是 teletypewriter的縮寫,因為它是從打字機(typewriters)演變過來的

如上圖所示,電傳打字機和大型電腦通過連接兩端的物理線來進行通信。溝通過程如下:

  • 當用戶從電傳打字機輸入時,ASCII 文本將一個字元一個字元地通過網路傳輸
  • 電腦的內核接收字元並對其進行解碼
  • 接著字元被送到一個名為 TTY driver 的驅動程式,這裡負責將輸入發送到用戶程式並收集輸出
  • 最後,內核將輸出發送回電傳打字機 ,以便顯示給用戶

需要提到的一點是 line discipline(行規則),它會將字元緩衝到內核記憶體中,直到按下 Enter” 鍵,程式才會接收到輸入

line discipline 允許這塊緩衝區是可編輯的,並提供了一些與程式無關的快捷鍵(例如 ctrl-w)

這在當時是一項重要的性能優化,因為讓程式員一個字元一個字元的處理是非常低效的

隨著計算技術的進步,這些獨立組件中的許多都實現了現代化。比如說電傳打字機被終端所取代,終端是完全電子的機器,包括電子顯示器

上圖是 DEC 於 1978 年發佈的 VT100 終端機(VT = video terminal),它實現並推廣了至今仍在使用的 ANSI 轉義碼

隨著電子終端的誕生,出現了越來越多的功能(例如顏色、鈴聲)。但本質上跟電傳打字機完全相同——發送輸入字元流並顯示輸出

現如今人人都有一臺自己的電腦,這些電腦的操作系統可以監督許多應用程式,終端不再是專門的硬體,而是變成了這些應用程式中的一個

與典型的 GUI 應用程式一樣,終端是操作系統監督下的一個進程,它監聽來自用戶的事件和輸入,並告訴操作系統在視窗中顯示什麼(終端不直接與外設交互,而是通過驅動程式和視窗管理器)

有時候我們還會聽到 ”終端模擬器“ 這個詞,而不是簡單的稱之為 ”終端“。這是因為 ”終端“ 指的是專門的硬體(終端機),而現在大多數的終端只是對該設備的模擬,是一個應用程式

但是我們這裡不做區分,”終端模擬器“ 和 ”終端“ 含義一樣

那麼當我們打開終端時會發生什麼呢?

打開終端

上面我們提到過,終端是一個應用程式,能夠讓你 ”使用你的電腦“(即在上面運行程式)。我們的電腦上可能已經存在了 ls、rm、mv 等程式

但是我們不滿足於使用這些簡單的命令,我們還希望使用腳本來實現自動化, 這些腳本將許多命令的序列組合在一起,使用分支條件邏輯,運行重覆迴圈或並行化命令等

為了讓電腦能夠讀懂我們的腳本並執行起來,我們需要一個完整的可交互的解釋型的編程環境——shell

將其他程式作為進程運行,讓操作系統內核讀懂你寫的腳本,這些工作都由 shell 完成。目前常見的 shell 有 Bash、Zsh 等

終端和 shell 是兩個獨立的程式:

  • shell 負責解釋你輸入的命令
  • 終端負責 UI 相關的東西,比如字體、顏色等

當我們打開終端時,終端會根據用戶生成一個 shell 進程,以及用戶與 shell 之間,用戶與 shell 啟動的進程之間通信的方法

這個 shell 進程負責解釋和執行用戶輸入的命令,並與用戶進行交互。用戶在終端輸入的命令將通過這個通信通道傳遞給 shell 進程進行解釋執行,並將執行結果反饋給用戶顯示在終端上

創建 PTY

偽終端設備(PTY)是在電腦操作系統中創建的一個虛擬設備,用於模擬物理終端的功能

在 UNIX、Linux 和類 UNIX 系統中,PTY 用於在用戶和程式之間建立一個通信通道,允許用戶通過終端會話與程式進行交互

PTY通常由兩個主要部分組成:主設備(leader)和從設備(follower)。leader端連接到用戶終端,follower端連接到一個或多個程式

當用戶打開終端並啟動一個 shell 時,終端模擬器會創建一個 PTY,並將 leader 端連接到用戶界面,同時將 follower 端連接到 shell 或其他命令行程式。用戶輸入的命令通過 leader 端傳輸到 follower端,follower端執行這些命令並將輸出發送回 leader 端,最終顯示在用戶界面上

在 Unix 中,一切皆文件,這句話指的是 Unix 中的所有東西都有與文件相同的讀/寫介面。leader 的 fd(文件描述符) 指向記憶體中的一個緩衝區,而 follower 是一個在磁碟上具有實際路徑的字元設備文件。

上圖可以看到,我們打開了兩個終端(/dev/pts/0、/dev/pts/1),啟動了兩個 shell 進程。如果我們在終端1(/dev/pts/1)中敲命令並重定向到終端0(/dev/pts/0),可以看到輸出結果是在終端0中顯示的

生成 shell

終端會話在啟動時可能會為shell創建一個子進程,這個子進程將作為 shell 的實例來執行用戶的命令

UNIX 和類 UNIX 系統中,終端會話會使用偽終端設備(PTY)來與 shell 進程進行通信,通過這種方式,終端會話可以讀取和寫入 shell 的輸入、輸出和錯誤輸出(fd 0到2)

shell 初始化

在Linux中,用戶打開終端啟動 shell 進程時會進行 shell 初始化,這個過程涉及一些配置文件和腳本的執行,用來設置用戶的環境和啟動 shell 的行為

步驟大致如下:

  1. 讀取配置文件:在用戶登錄時,shell 會讀取一系列的配置文件來設置用戶的環境變數、別名、函數等。這些配置文件可以包括全局配置文件(例如/etc/profile)和用戶特定的配置文件(例如~/.bash_profile~/.bashrc等)
  2. 執行配置命令:配置文件中可以包含各種設置和命令,例如設置環境變數、修改提示符、定義別名和函數等。這些命令會在 shell 啟動時執行,以確保在用戶登錄後設置了所需的環境和行為
  3. 啟動shell:一旦執行了配置文件中的命令,shell 就會準備就緒,等待用戶的輸入。這時,shell 的提示符會出現,等待用戶輸入命令。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • tip:[start]學習編程語言語法是次要的,思維是主要的。如何把頭腦中的想法變成簡潔的代碼,至關重要。——閆學燦tip:[end] 學習迴圈語句只需要抓住一點:代碼執行順序! while迴圈 可以簡單理解為迴圈版的if語句。if語句是判斷一次,如果條件成立,則執行後面的語句;while是每次判斷 ...
  • 背景: 使用com.github.docker-java庫可以很方便地在Java中操作Docker。下麵是一個詳細的教程,包括創建鏡像、創建容器、啟動容器、停止容器和刪除容器的步驟以及每一步的說明。 前提: 首先,在你的Java項目中添加com.github.docker-java庫的依賴。你可以在 ...
  • 概述 ThreadLocal 意為本地線程變數,即該變數只屬於當前線程,對其他線程隔離 我們知道,一個普通變數如果被多線程訪問會存在存線上程安全問題,這時我們可以使用 Synchronize 來保證該變數某一時刻只能有一個線程訪問,從而解決併發安全問題 但如果這個變數並不需要被共用,那麼就可以使用 ...
  • Qt 是一個跨平臺C++圖形界面開發庫,利用Qt可以快速開發跨平臺窗體應用程式,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現圖形化開發極大的方便了開發效率,本章將重點介紹`LineEdit`單行輸入框組件的常用方法及靈活運用。在Qt中,`QLineEdit`是一個用於輸入單行文本的控... ...
  • 在任何系統中,日誌都是非常重要的組成部分,它是反映系統運行情況的重要依據,也是排查問題時的必要線索。絕大多數人都認可日誌的重要性,但是又有哪些場景可能導致性能問題?今天就讓我們來聊聊Java日誌性能那些事。 ...
  • 一:背景 1. 講故事 在高級調試的旅行中,發現有不少人對符號表不是很清楚,其實簡而言之符號表中記錄著一些程式的生物特征,比如哪個地址是函數(簽名信息),哪個地址是全局變數,靜態變數,行號是多少,數據類型是什麼 等等,目的就是輔助我們可視化的調試,如果沒有這些輔助我們看到的都是一些無意義的彙編代碼, ...
  • 下麵針對 ASP.NET Core 中修改預設埠的五種常用方法的詳細示例,分別對應 appsettings.json 配置 Kestrel 的 Endpoint、使用 UseUrls 方法、命令行參數方法、host.json 配置方法和使用 Docker 的方式。 方法一:appsettings. ...
  • VS2022之後,其實還挺好用的,但個人還是習慣VS+Resharper的強強組合,尤其是Ctrl+N快捷鍵的全局搜,比VS自帶的Ctrl+T好用太多了,Ctrl+B還能直接查看反編譯之後的dll的方法。下麵是常用VS快捷鍵,收藏記錄下。 1、項目快捷鍵CTRL + SHIFT + B生成解決方案C ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...