首頁  >  文章  >  運維  >  linux ptys是什麼

linux ptys是什麼

藏色散人
藏色散人原創
2023-04-20 10:32:532557瀏覽

linux ptys是指Linux偽終端,而偽終端則是指偽終端master和偽終端slave這一對字元設備;其中的slave對應「/dev/pts/」目錄下的一個文件,而master則在記憶體中標識為一個檔案描述符;偽終端由終端模擬器提供,終端模擬器是一個運行在用戶態的應用程式。

linux ptys是什麼

本教學操作環境:linux5.9.8系統、Dell G3電腦。

linux ptys是什麼?

Linux 偽終端(pty)

我們常說的終端機分為終端 tty1-6 和偽終端。使用 tty1-6 的情況一般為 Linux 系統直接連了鍵盤和顯示器,或者是使用了 vSphere console 等虛擬化方案,其它情況下使用的都是偽終端。本文將介紹偽終端的基本概念。本文示範部分所使用的環境為 ubuntu 18.04。

偽終端

偽終端(pseudo terminal,有時也稱為pty)是指偽終端master 和偽終端slave 這一對字元設備。其中的 slave 對應 /dev/pts/ 目錄下的一個文件,而 master 則在記憶體中標識為一個文件描述符(fd)。偽終端由終端模擬器提供,終端模擬器是運行在用戶態的應用程式。

Master 端是更接近使用者顯示器、鍵盤的一端,slave 端是在虛擬終端上執行的 CLI(Command Line Interface,命令列介面)程式。 Linux 的偽終端驅動程序,會把 master 端(如鍵盤)寫入的資料轉發給 slave 端供程式輸入,把程式寫入 slave 端的資料轉發給 master 端供(顯示器驅動等)讀取。請參考下面的示意圖(此圖來自互聯網):

#我們開啟的終端桌面程序,例如GNOME Terminal,其實是一種終端模擬軟體。當終端模擬軟體運作時,它透過開啟 /dev/ptmx 檔案建立了一個偽終端的 master 和 slave 對,並讓 shell 運行在 slave 端。當使用者在終端模擬軟體中按下鍵盤按鍵時,它產生位元組流並寫入master 中,shell 進程便可從slave 中讀取輸入;shell 和它的子程序,將輸出內容寫入slave 中,由終端模擬軟體負責將字元列印到視窗中。

偽終端機的使用場景

偽終端大概有三類使用場景:

  • 像xterm、gnome-terminal 等圖形介面的終端模擬軟體將鍵盤和滑鼠事件轉換為文字輸入,並圖形化地顯示輸出內容
  • 遠端shell 應用程式(如sshd)在客戶機上的遠端終端機和伺服器上的偽終端機之間中繼輸入和輸出
  • 多工器應用程式,如screen 和tmux。它們把輸入和輸出從一個終端轉播到另一個終端,使文字模式的應用程式從實際的終端上脫離

Linux 中為什麼要提出偽終端這個概念呢? shell 等命令列程式不可以直接從顯示器和鍵盤讀取資料嗎?
為了同屏運行多個終端模擬器、並實現遠端登錄,還真不能讓 shell 直接跨越偽終端這一層。在作業系統的一大想法——虛擬化的指導下,為多個終端模擬器、遠端使用者分配多個虛擬的終端是有必要的。上圖中的 shell 所使用的 slave 端就是一個虛擬化的終端。 Master 端是模擬使用者一端的互動。之所以稱為虛擬化的終端,是因為它除了轉送資料流外,還要有點終端機的樣子。

偽終端原理

偽終端本質上是運行在用戶狀態的終端模擬器所建立的一對字元設備。其中的 slave 對應 /dev/pts/ 目錄下的一個文件,而 master 則在記憶體中標識為一個文件描述符(fd)。對於偽終端來說,重點是軟體模擬終端程式運行在用戶空間,這是它與終端的本質區別,請參考下面的示意圖:

linux ptys是什麼

/dev/ptmx 是字元裝置文件,當進程開啟/dev/ptmx 檔案時,進程會同時獲得一個指向pseudoterminal master( ptm)的檔案描述符和一個在/dev/pts 目錄中建立的pseudoterminal slave(pts) 裝置。透過開啟/dev/ptmx 檔案所獲得的每個檔案描述子都是一個獨立的ptm,它有自己關聯的pts,ptmx(可以認為記憶體中有一個ptmx 物件)在內部會維護該檔案描述子和pts 的對應關係,這個檔案描述子的讀寫都會被ptmx 轉送到對應的pts。我們可以透過lsof 指令查看ptmx 開啟的檔案描述子:

$ sudo lsof /dev/ptmx

##進程預設的IO

一般情況下我們透過遠端連線的方式執行指令時,進程的標準輸入、標準輸出和標準錯誤輸出都會綁定到偽終端機上,下面是一個簡單的demo 程式:

#include <stdio.h>#include <unistd.h>int main()
{
    printf("PID : %d\n", getpid());
    sleep(200);

    printf("\n");    return 0;
}</unistd.h></stdio.h>

把這段程式碼保存在檔案mydemo.c 中,然後執行下面的命令編譯並執行該程式:

$ gcc -Wall mydemo.c -o demo
$ ./demo

demo 程式輸出了自己行程的PID,現在另外開啟一個終端執行lsof 指令:

$ lsof -p 17981

#可以看到進程的0u(標準輸入)、1u(標準輸出)、2u(標準錯誤輸出)都綁定到了偽終端/dev/pts/0 上。

推薦學習:《

linux影片教學

以上是linux ptys是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn