首頁  >  文章  >  運維  >  最詳細的Linux終端機和Line discipline圖解

最詳細的Linux終端機和Line discipline圖解

小云云
小云云原創
2017-12-18 11:17:515841瀏覽

Line discipline,到底翻譯成行規程還是線路規程,沒有統一的標準,我選用行規程,但這並不意味著操作的單位就是一行,特此澄清。本文我們就和大家分享最詳細的Linux終端機和Line discipline圖解教程,希望能幫助大家。

什麼是行規程

當我們在一個終端機上按下按鍵“l”的時候,終端機只是把字母“l”回顯了回來,緊接著按下按鍵“s”,依然是回顯字母“s”,隨後我們按下回車鍵,回顯的不再是回車鍵(請問怎麼回顯),而是列出並顯示了目前目錄下的所有文件,這些規則是如何定義的?

  當我們按下組合鍵「Ctrl-C」的時候,目前的進程就終止了,這個又是如何規定的?為什麼不是組合鍵「Shift-B」來完成同樣的事?

  如果你對鍵盤夠了解(我了解,但並不足夠),就會知道有很多的組合鍵可以使用,這些組合鍵分別在不同的系統,不同的終端機上如何定義的,誰來規定按下什麼鍵發生什麼事?

  所有這些問題都可以用行規程來回答。那什麼是行規程呢?

  行規程是一套約定俗成的協定。約定雙方可以是電腦和終端機(包括輸出設備和人體輸入設備)。在這個意義上,終端就是所謂的人機介面。

  我來簡單解釋一下。行規程規定了鍵盤,串口,印表機,顯示器等輸入輸出設備和用戶態Shell等程式之間的行為規範,鍵盤上的按鍵事件被行規程解釋成了Shell可以理解的輸入並給出對應的輸出。人們要操作計算機,這套規程是必不可少的,它事實上規定了資訊從外部進入計算機的規範。

  可以使用stty指令來展示你的終端行規程的設定:

最詳細的Linux終端機和Line discipline圖解


最詳細的Linux終端機和Line discipline圖解

最詳細的Linux終端機和Line discipline圖解

瞭解行規程

以Linux為例,下圖是行規程在整個體系結構中的位置:

最詳細的Linux終端機和Line discipline圖解

####### ####我們可以看出資訊流的方向,是一個縱向的通路,一端是電腦程序,另一端是某種硬體(這裡還有偽終端的概念,參見徹底理解Linux的各種終端類型以及概念),作為對比,我們來看看另一個方向的資料通路,也就是橫向的通路,典型的例子就是TCP/IP協定堆疊:################## ###TCP/IP協定通訊和終端行規程完全不同,終端行規程完全是一個縱向的協議,而TCP/IP則側重於橫向的對等層通信,和終端行規程作為人機介面不同的是,TCP/IP更重要的作用是處理任意進程之間的通訊。但抽掉這種資料路徑方向上的不同,剩下的東西它們就是一致的了,即它們都是某種約定俗成的協議,約定的雙方是否同質對等造成了唯一的區別。 ############SLIP的位置############作為一個綜合的例子,我們來看看關於SLIP的內容。 ############  SLIP就是Serial Line Internet Protocol(序列線路網路協定)可能現在很少人再使用它了,畢竟現如今都是乙太網路和光纖的天下了,誰還會用串列埠線來傳輸網路封包。 ############  但是它在以前很長一段時間一直作為連接運行TCP/IP協定的主機的專用鏈路存在的。 ############  我們知道,TCP/IP是對等層通訊協議,但是最終的資料包不得不透過某種實體媒體傳輸,因此還需要一種縱向的協定才可以讓對等層通訊得以實現。我們把橫向的對等層協議叫做通信協議,而縱向的協議叫做傳輸協議,行規程事實上就是一種傳輸協議,SLIP實際上就是一種行規程,SLIP行規程把串口線上傳輸的字符解釋成IP資料報文並向上遞送。這種行規程和TCP/IP的關係如下所示:###############

可以看得出,SLIP作為一中行規程,並沒有把解析後的資料繼續提交到與之綁定的TTY緩衝區,而是將解析後的資料作為IP資料報直接遞送給了TCP/IP協定棧來處理。

  這裡摘取百度百科上的一段話:

<span style="font-size: 16px;">SLIP只是一个包组帧协议,仅仅定义了在串行线路上将数据包封装成帧的一系列字符。它没有提供寻址、包类型标识、错误检查/修正或者压缩机制。<br></span>

廣義地來講,其實像乙太網路規範這種也可以叫做某種行規程,畢竟它也是約定IP層軟體和傳輸介質之間行為規範的協議,起到的均是對資料格式化的作用,但由於如今超高速傳輸早就完完全全基於比特流序列,不再透過定義以字元為邊界的區塊來封裝數據,所以再叫做行規程就有點詞不達意了,但本質上都是一樣的,都是定義在某種介質上如何把資料包封裝的協定。


關於unix98偽終端機

關於偽終端的這部分內容參見:SVR4/4.3BSD與Linux對待偽終端的不同方式


全域的視角圖解幾個終端機

好了,是總結的時候了。

  在上一篇文章徹底理解Linux的各種終端類型以及概念,我是採用環的方式給出了一個關於終端的總圖,後來有人發來郵件反映,所有的終端類型進入一張圖,雖然是很統一,但是太複雜了,所以本文我還是決定把這些分開,略去比較多的細節,在全局的角度來看一下終端的結構。

  站在bash的角度,bash本身並不知道其終端到底是直連的,串口連接的,還是說SSH連過來的,這意味著內核裡有一個適配層,在這個層之上,所有的終端看起來是一模一樣的,在這個層以下,卻盡顯個性:

最詳細的Linux終端機和Line discipline圖解

##我們接下來就來看看這些不同點在哪裡。

本機終端

最詳細的Linux終端機和Line discipline圖解

#序列埠線連接的終端機

最詳細的Linux終端機和Line discipline圖解

SSH偽終端

最詳細的Linux終端機和Line discipline圖解

#Tmux偽終端機

本來是想把Tmux跟Screen一起說的,但是Screen和Tmux原理幾乎是一模一樣,所以就省掉了Screen,這裡只說Tmux:

最詳細的Linux終端機和Line discipline圖解

還是有點複雜是不是?

  其實確實比較複雜,這裡只需要知道兩點就好了,首先,把Tmux Server以及它Fork當作不會斷的SSH就好了,其次,當你在一個SSH偽終端機運行Tmux Client的時候,Tmux Client相當於把該SSH偽終端機的pts借給了Tmux Server,Tmux Server和SSHd是並列的。

  • Tmux Server開啟一對偽終端,自己持有主設備,將次設備繼承給它Fork出來的Bash,此一對進程進入後台,不再歸屬任何終端。

最詳細的Linux終端機和Line discipline圖解

  • #一旦Tmux Client運行於某個SSH終端,它會把目前終端的pts傳遞給Tmux Server,從而讓Tmux Server作為一個資料代理程式傳遞輸入和輸出。

最詳細的Linux終端機和Line discipline圖解

一旦Tmux Client運行,它就成為了當前Bash的前台進程,通過重定向之後,當前Tmux Client便成為了Bash0的前端,接收Bash0的輸入與輸出。文件句柄轉交後的流程如下:#

<span style="font-size: 16px;">1. 有人在远端的Windows主机上敲入一个字符***“a”***;2. 字符***“a”***经由SSH客户端加密后传输到Linux SSH服务器SSHd并解密;3. 字符***“a”***通过SSHd的ptmx写入4. Tmux Server从pts/2将字符***“a”***读出并写入ptmx;5. Bash0将字符***“a”***从pts/1读出并执行;6. Bash0将***-bash: a: command not found***按原路返回给Windows。<br></span>

注释:关于文件句柄传递

有人说Linux可以靠一个ioctl系统调用在不同进程之间传递文件描述符,然而当你真的去自己尝试时,却发现这是骗人的。那么同样的功能如何来实现?你如何不通过调用open,accept,socket这类系统调用打开一个文件句柄呢?

  答案就是使用SCM_RIGHTS。具体怎么做,百度一下,你就知道。


题外话

最后,依然说点题外话。

  现如今关于终端等人机接口的内容被淡化了,然而关于TCP/IP的内容却得到了强化,我认为这是不公平的。

  当然,这是近来不断提高软件地位而降低硬件地位的后果,大多数人都知道socket如何到socket,却只有很少的人知道socket如何到网线,而后者才是基础。数据从哪里来?

  没有数据何谈通信?数据不可能凭空就存在于计算机,它必然靠某种设备从外界输入,比如键盘,扫描仪,传感器等,首先这些设备和计算机之间的数据传输协议才基础中的基础,此后针对数据的加工才会用到TCP/IP,IPC这种对等层通信协议。

  随着物联网的发展,关于数据如何进入计算机这个问题还会有很多新的解答,因此以上的局面得以改观。

牢骚

———————–截止2017/12/16 11:08文章已写完———————–

东北极寒天吃饭,要乱炖多点肉喝点酒;河南的冷天吃饭,要吃大烩菜,一人盛一碗,陕西山西冷天吃饭,羊排锅加竹叶青酒超爽…但是现在在华南,深圳的今天气温比较低,这天气说冷不冷,但确实有点寒意,我决定今天穿上长裤…准备出发去吃好爽的火锅底料。
  华南的深圳,北纬22°不到23°,这是热带的边缘,正因为其地理因素,冬季会受到北方冷空气的影响,所以这里被归为一个叫做亚热带的尴尬区域,所谓亚热带主要就是为了照顾北方的冬天,北方人不是怕冷吗?那就为北方制造一个叫做亚热带的地方,可谓仁慈。不管怎样,我现在依然还是短衣短裤的…我是迫于众人的目光压力穿上长裤的,不然会被认为是傻逼,但是在室内或者刚吃完饭后,真觉得热…唉!

昨晚的圣诞晚会嗨爆全场,灯光音响很棒,然而最终还是没有中奖…回到家已经午夜,喝了一瓶真露想再写篇关于终端的随笔以解惑,但不知不觉就困了,于是就睡了,早上本来想早起,自然醒来已经七点半了,醒来并没有意识到今天很冷,第一件事反而是想中午一家人去吃顿川味火锅底料,这也算是响应老板们的号召了。所以说,我必须在11点前把这篇文章写完。

  Line discipline,到底翻译成行规程还是线路规程,没有统一的标准,我选用行规程,但这并不意味着操作的单位就是一行,特此澄清。

什么是行规程

当我们在一个终端上按下按键“l”的时候,终端只是把字母“l”回显了回来,紧接着按下按键“s”,依然是回显字母“s”,随后我们按下回车键,回显的不再是回车键(请问怎么回显),而是列出并显示了当前目录下的所有文件,这些规则是如何定义的?

  当我们按下组合键“Ctrl-C”的时候,当前的进程就终止了,这个又是如何规定的?为什么不是组合键“Shift-B”来完成同样的事?

  如果你对键盘足够了解(我了解,但并不足够),就会知道有很多的组合键可以使用,这些组合键分别在不同的系统,不同的终端上如何定义的,谁来规定按下什么键发生什么事?

  所有这些问题都可以用行规程来回答。那么什么是行规程?

  行规程是一套约定俗成的协议。约定双方可以是计算机和终端(包括输出设备和人体输入设备)。在这个意义上,终端就是所谓的人机接口。

  我来简单解释一下。行规程规定了键盘,串口,打印机,显示器等输入输出设备和用户态Shell等程序之间的行为规范,键盘上的按键事件被行规程解释成了Shell可以理解的输入并给出相应的输出。人们要想操作计算机,这套规程是必不可少的,它事实上规定了信息从外部进入计算机的规范。

  可以使用stty命令来展示你的终端行规程的配置:

最詳細的Linux終端機和Line discipline圖解


理解行规程

以Linux为例,下图是行规程在整个体系结构中的位置:

最詳細的Linux終端機和Line discipline圖解

我们可以看出信息流的方向,是一个纵向的通路,一端是计算机程序,另一端是某种硬件(这里还有伪终端的概念,参见彻底理解Linux的各种终端类型以及概念),作为对比,我们来看看另外一种方向的数据通路,即横向的通路,典型的例子就是TCP/IP协议栈:

最詳細的Linux終端機和Line discipline圖解

TCP/IP协议通信和终端行规程完全不同,终端行规程完全是一个纵向的协议,而TCP/IP则侧重于横向的对等层通信,和终端行规程作为人机接口不同的是,TCP/IP更重要的作用是处理任意进程之间的通信。但抽掉这种数据通路方向上的不同,剩下的东西它们就是一致的了,即它们都是某种约定俗成的协议,约定的双方是否同质对等造成了唯一的区别。

SLIP的位置

作为一个综合的例子,我们来看点关于SLIP的内容。

  SLIP就是Serial Line Internet Protocol(串行线路网际协议)可能现在很少有人再使用它了,毕竟现如今都是以太网和光纤的天下了,谁还会用串口线来传输网络数据包。

  但是它在以前很长一段时间一直作为连接运行TCP/IP协议的主机的专用链路存在的。

  我们知道,TCP/IP是对等层通信协议,但是最终的数据包不得不通过某种物理介质传输,因此还需要一种纵向的协议才可以让对等层通信得以实现。我们把横向的对等层协议叫做通信协议,而纵向的协议叫做传输协议,行规程事实上就是一种传输协议,SLIP实际上就是一种行规程,SLIP行规程把串口线上传输的字符解释成IP数据报文并向上递送。这种行规程和TCP/IP的关系如下所示:

最詳細的Linux終端機和Line discipline圖解

可以看得出,SLIP作為一中行規程,並沒有把解析後的資料繼續提交到與之綁定的TTY緩衝區,而是將解析後的資料作為IP資料報直接遞送給了TCP/IP協定棧來處理。

  這裡摘取百度百科上的一段話:

<span style="font-size: 16px;">SLIP只是一个包组帧协议,仅仅定义了在串行线路上将数据包封装成帧的一系列字符。它没有提供寻址、包类型标识、错误检查/修正或者压缩机制。<br></span>

廣義地來講,其實像乙太網路規範這種也可以叫做某種行規程,畢竟它也是約定IP層軟體和傳輸介質之間行為規範的協議,起到的均是對資料格式化的作用,但由於如今超高速傳輸早就完完全全基於比特流序列,不再透過定義以字元為邊界的區塊來封裝數據,所以再叫做行規程就有點詞不達意了,但本質上都是一樣的,都是定義在某種介質上如何把資料包封裝的協定。


關於unix98偽終端機

關於偽終端的這部分內容參見:SVR4/4.3BSD與Linux對待偽終端的不同方式


全域的視角圖解幾個終端機

好了,是總結的時候了。

  在上一篇文章徹底理解Linux的各種終端類型以及概念,我是採用環的方式給出了一個關於終端的總圖,後來有人發來郵件反映,所有的終端類型進入一張圖,雖然是很統一,但是太複雜了,所以本文我還是決定把這些分開,略去比較多的細節,在全局的角度來看一下終端的結構。

  站在bash的角度,bash本身並不知道其終端到底是直連的,串口連接的,還是說SSH連過來的,這意味著內核裡有一個適配層,在這個層之上,所有的終端看起來是一模一樣的,在這個層以下,卻盡顯個性:

最詳細的Linux終端機和Line discipline圖解

##我們接下來就來看看這些不同點在哪裡。

本機終端

最詳細的Linux終端機和Line discipline圖解

#序列埠線連接的終端機

最詳細的Linux終端機和Line discipline圖解

SSH偽終端

最詳細的Linux終端機和Line discipline圖解

#Tmux偽終端機

本來是想把Tmux跟Screen一起說的,但是Screen和Tmux原理幾乎是一模一樣,所以就省掉了Screen,這裡只說Tmux:

最詳細的Linux終端機和Line discipline圖解

還是有點複雜是不是?

  其實確實比較複雜,這裡只需要知道兩點就好了,首先,把Tmux Server以及它Fork當作不會斷的SSH就好了,其次,當你在一個SSH偽終端機運行Tmux Client的時候,Tmux Client相當於把該SSH偽終端機的pts借給了Tmux Server,Tmux Server和SSHd是並列的。

  • Tmux Server開啟一對偽終端,自己持有主設備,將次設備繼承給它Fork出來的Bash,此一對進程進入後台,不再歸屬任何終端。

最詳細的Linux終端機和Line discipline圖解

  • #一旦Tmux Client運行於某個SSH終端,它會把目前終端的pts傳遞給Tmux Server,從而讓Tmux Server作為一個資料代理程式傳遞輸入和輸出。

最詳細的Linux終端機和Line discipline圖解

一旦Tmux Client運行,它就成為了當前Bash的前台進程,通過重定向之後,當前Tmux Client便成為了Bash0的前端,接收Bash0的輸入與輸出。文件句柄轉交後的流程如下:#

<span style="font-size: 16px;">1. 有人在远端的Windows主机上敲入一个字符***“a”***;2. 字符***“a”***经由SSH客户端加密后传输到Linux SSH服务器SSHd并解密;3. 字符***“a”***通过SSHd的ptmx写入4. Tmux Server从pts/2将字符***“a”***读出并写入ptmx;5. Bash0将字符***“a”***从pts/1读出并执行;6. Bash0将***-bash: a: command not found***按原路返回给Windows。<br></span>

注释:关于文件句柄传递

有人说Linux可以靠一个ioctl系统调用在不同进程之间传递文件描述符,然而当你真的去自己尝试时,却发现这是骗人的。那么同样的功能如何来实现?你如何不通过调用open,accept,socket这类系统调用打开一个文件句柄呢?

  答案就是使用SCM_RIGHTS。具体怎么做,百度一下,你就知道。


题外话

最后,依然说点题外话。

  现如今关于终端等人机接口的内容被淡化了,然而关于TCP/IP的内容却得到了强化,我认为这是不公平的。

  当然,这是近来不断提高软件地位而降低硬件地位的后果,大多数人都知道socket如何到socket,却只有很少的人知道socket如何到网线,而后者才是基础。数据从哪里来?

  没有数据何谈通信?数据不可能凭空就存在于计算机,它必然靠某种设备从外界输入,比如键盘,扫描仪,传感器等,首先这些设备和计算机之间的数据传输协议才基础中的基础,此后针对数据的加工才会用到TCP/IP,IPC这种对等层通信协议。

  随着物联网的发展,关于数据如何进入计算机这个问题还会有很多新的解答,因此以上的局面得以改观。

相关推荐:

Linux终端类型的详解

Linux終端機中文顯示亂碼

Linux終端機學習一

以上是最詳細的Linux終端機和Line discipline圖解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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