久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

一起聊聊Linux TTY/PTS及其作用區(qū)別

下面由linux系統(tǒng)教程欄目給大家介紹Linux TTY/PTS及其作用區(qū)別,希望對(duì)需要的朋友有所幫助!

Linux TTY/PTS概述

當(dāng)我們在鍵盤上敲下一個(gè)字母的時(shí)候,到底是怎么發(fā)送到相應(yīng)的進(jìn)程的呢?我們通過ps、who等命令看到的類似tty1、pts/0這樣的輸出,它們的作用和區(qū)別是什么呢?

TTY歷史

支持多任務(wù)的計(jì)算機(jī)出現(xiàn)之前

在計(jì)算機(jī)出來以前,人們就已經(jīng)在使用一種叫teletype的設(shè)備,用來相互之間傳遞信息,看起來像下面這樣:

+----------+     Physical Line     +----------+ | teletype |<--------------------->| teletype | +----------+                       +----------+

兩個(gè)teletype之間用線連接起來,線兩端可能也有類似于調(diào)制解調(diào)器之類的設(shè)備(這里將它們忽略),在一端的teletype上敲鍵盤時(shí),相應(yīng)的數(shù)據(jù)會(huì)發(fā)送到另一端的teletype,具體功能是干什么的,我也不太了解。(我腦袋里面想到畫面是在一端敲字,另一端打印出來)

這些都是老古董了,完全沒接觸過,所以只能簡單的推測。

支持多任務(wù)的計(jì)算機(jī)出現(xiàn)之后

等到計(jì)算機(jī)支持多任務(wù)后,人們想到把這些teletype連到計(jì)算機(jī)上,作為計(jì)算機(jī)的終端,從而可以操作計(jì)算機(jī)。

使用teletype的主要原因有兩個(gè)(個(gè)人見解):

  • 現(xiàn)實(shí)中已經(jīng)存在了大量不同廠商的teletype,可以充分利用現(xiàn)有資源

  • teletype的相關(guān)網(wǎng)絡(luò)已經(jīng)比較成熟,連起來方便

于是連接就發(fā)展成這樣:

                                                                      +----------+  +----------+   +-------+     Physical Line     +-------+   +------+   |          | | Terminal |<->| Modem |<--------------------->| Modem |<->| UART |<->| Computer | +----------+   +-------+                       +-------+   +------+   |          |                                                                       +----------+
  • 左邊的Terminal就是各種各樣的teletype

  • 物理線路兩邊用上了Modem,就是我們常說的“貓”,那是因?yàn)楹髞砭W(wǎng)絡(luò)已經(jīng)慢慢的變發(fā)達(dá)了,大家可以共享連接了。(大概推測,可能不對(duì))

  • UART可以理解為將teletype的信號(hào)轉(zhuǎn)換成計(jì)算機(jī)能識(shí)別的信號(hào)的設(shè)備

內(nèi)核TTY子系統(tǒng)

計(jì)算機(jī)為了支持這些teletype,于是設(shè)計(jì)了名字叫做TTY的子系統(tǒng),內(nèi)部結(jié)構(gòu)如下:

    +-----------------------------------------------+     |                    Kernel                     |     |                                 +--------+    |     |   +--------+   +------------+   |        |    |       +----------------+     |   |  UART  |   |    Line    |   |  TTY   |<---------->| User process A | <------>|        |<->|            |<->|        |    |       +----------------+     |   | driver |   | discipline |   | driver |<---------->| User process B |     |   +--------+   +------------+   |        |    |       +----------------+     |                                 +--------+    |     |                                               |     +-----------------------------------------------+
  • UART driver對(duì)接外面的UART設(shè)備

  • Line discipline主要是對(duì)輸入和輸出做一些處理,可以理解它是TTY driver的一部分

  • TTY driver用來處理各種終端設(shè)備

  • 用戶空間的進(jìn)程通過TTY driver來和終端打交道

為了簡單起見,后面的介紹中不再單獨(dú)列出UART driver和Line discipline,可以認(rèn)為它們是TTY driver的一部分

TTY設(shè)備

對(duì)于每一個(gè)終端,TTY driver都會(huì)創(chuàng)建一個(gè)TTY設(shè)備與它對(duì)應(yīng),如果有多個(gè)終端連接過來,那么看起來就是這個(gè)樣子的:

                      +----------------+                       |   TTY Driver   |                       |                |                       |   +-------+    |       +----------------+  +------------+       |   |       |<---------->| User process A |  | Terminal A |<--------->| ttyS0 |    |       +----------------+  +------------+       |   |       |<---------->| User process B |                       |   +-------+    |       +----------------+                       |                |                       |   +-------+    |       +----------------+  +------------+       |   |       |<---------->| User process C |  | Terminal B |<--------->| ttyS1 |    |       +----------------+  +------------+       |   |       |<---------->| User process D |                       |   +-------+    |       +----------------+                       |                |                       +----------------+

當(dāng)驅(qū)動(dòng)收到一個(gè)終端的連接時(shí),就會(huì)根據(jù)終端的型號(hào)和參數(shù)創(chuàng)建相應(yīng)的tty設(shè)備(上圖中設(shè)備名稱叫ttyS0是因?yàn)榇蟛糠纸K端的連接都是串行連接),由于每個(gè)終端可能都不一樣,有自己的特殊命令和使用習(xí)慣,于是每個(gè)tty設(shè)備的配置可能都不一樣。比如按delete鍵的時(shí)候,有些可能是要?jiǎng)h前面的字符,而有些可能是刪后面的,如果沒配置對(duì),就會(huì)導(dǎo)致某些按鍵不是自己想要的行為,這也是我們在使用模擬終端時(shí),如果默認(rèn)的配置跟我們的習(xí)慣不符,需要做一些個(gè)性化配置的原因。

后來隨著計(jì)算機(jī)的不斷發(fā)展,teletype這些設(shè)備逐漸消失,我們不再需要專門的終端設(shè)備了,每個(gè)機(jī)器都有自己的鍵盤和顯示器,每臺(tái)機(jī)器都可以是其它機(jī)器的終端,遠(yuǎn)程的操作通過ssh來實(shí)現(xiàn),但是內(nèi)核TTY驅(qū)動(dòng)這一架構(gòu)沒有發(fā)生變化,我們想要和系統(tǒng)中的進(jìn)程進(jìn)行I/O交互,還是需要通過TTY設(shè)備,于是出現(xiàn)了各種終端模擬軟件,并且模擬的也是常見的幾種終端,如VT100、VT220、XTerm等。

  1. 可以通過命令toe -a列出系統(tǒng)支持的所有終端類型

  2. 可以通過命令infocmp來比較兩個(gè)終端的區(qū)別,比如infocmp vt100 vt220將會(huì)輸出vt100和vt220的區(qū)別。

程序如何和TTY打交道

在討論TTY設(shè)備是如何被創(chuàng)建及配置之前,我們先來看看TTY是如何被進(jìn)程使用的:

#先用tty命令看看當(dāng)前bash關(guān)聯(lián)到了哪個(gè)tty dev@debian:~$ tty /dev/pts/1  #看tty都被哪些進(jìn)程打開了 dev@debian:~$ lsof /dev/pts/1 COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME bash     907  dev    0u   CHR  136,1      0t0    4 /dev/pts/1 bash     907  dev    1u   CHR  136,1      0t0    4 /dev/pts/1 bash     907  dev    2u   CHR  136,1      0t0    4 /dev/pts/1 bash     907  dev  255u   CHR  136,1      0t0    4 /dev/pts/1 lsof    1118  dev    0u   CHR  136,1      0t0    4 /dev/pts/1 lsof    1118  dev    1u   CHR  136,1      0t0    4 /dev/pts/1 lsof    1118  dev    2u   CHR  136,1      0t0    4 /dev/pts/1  #往tty里面直接寫數(shù)據(jù)跟寫標(biāo)準(zhǔn)輸出是一樣的效果 dev@dev:~$ echo aaa > /dev/pts/2 aaa

pts也是tty設(shè)備,它們的關(guān)系后面會(huì)介紹到

通過上面的lsof可以看出,當(dāng)前運(yùn)行的bash和lsof進(jìn)程的stdin(0u)、stdout(1u)、stderr(2u)都綁定到了這個(gè)TTY上。

下面是tty和進(jìn)程以及I/O設(shè)備交互的結(jié)構(gòu)圖:

   Input    +--------------------------+    R/W     +------+ ----------->|                          |<---------->| bash |             |          pts/1           |            +------+ <-----------|                          |<---------->| lsof |    Output   | Foreground process group |    R/W     +------+             +--------------------------+
  • 可以把tty理解成一個(gè)管道(pipe),在一端寫的內(nèi)容可以從另一端讀取出來,反之亦然。

  • 這里input和output可以簡單的理解為鍵盤和顯示器,后面會(huì)介紹在各種情況下input/ouput都連接的什么東西。

  • tty里面有一個(gè)很重要的屬性,叫Foreground process group,記錄了當(dāng)前前端的進(jìn)程組是哪一個(gè)。process group的概念會(huì)在下一篇文章中介紹,這里可以簡單的認(rèn)為process group里面只有一個(gè)進(jìn)程。

  • 當(dāng)pts/1收到input的輸入后,會(huì)檢查當(dāng)前前端進(jìn)程組是哪一個(gè),然后將輸入放到進(jìn)程組的leader的輸入緩存中,這樣相應(yīng)的leader進(jìn)程就可以通過read函數(shù)得到用戶的輸入

  • 當(dāng)前端進(jìn)程組里面的進(jìn)程往tty設(shè)備上寫數(shù)據(jù)時(shí),tty就會(huì)將數(shù)據(jù)輸出到output設(shè)備上

  • 當(dāng)在shell中執(zhí)行不同的命令時(shí),前端進(jìn)程組在不斷的變化,而這種變化會(huì)由shell負(fù)責(zé)更新到tty設(shè)備中

從上面可以看出,進(jìn)程和tty打交道很簡單,只要保證后臺(tái)進(jìn)程不要讀寫tty就可以了,即寫后臺(tái)程序時(shí),要將stdin/stdout/stderr重定向到其它地方(當(dāng)然deamon程序還需要做很多其它處理)。

先拋出兩個(gè)問題(后面有答案):

  • 當(dāng)非前端進(jìn)程組里面的進(jìn)程(后臺(tái)進(jìn)程)往tty設(shè)備上寫數(shù)據(jù)時(shí),會(huì)發(fā)生什么?會(huì)輸出到outpu上嗎?

  • 當(dāng)非前端進(jìn)程組里面的進(jìn)程(后臺(tái)進(jìn)程)從tty設(shè)備上讀數(shù)據(jù)時(shí),會(huì)發(fā)生什么?進(jìn)程會(huì)阻塞嗎?

TTY是如何被創(chuàng)建的

下面介紹幾種常見的情況下tty設(shè)備是如何創(chuàng)建的,以及input和output設(shè)備都是啥。

鍵盤顯示器直連(終端)

先看圖再說話:

                   +-----------------------------------------+                    |          Kernel                         |                    |                           +--------+    |       +----------------+   +----------+      |   +-------------------+   |  tty1  |<---------->| User processes |  | Keyboard |--------->|                   |   +--------+    |       +----------------+  +----------+      |   | Terminal Emulator |<->|  tty2  |<---------->| User processes |  | Monitor  |<---------|                   |   +--------+    |       +----------------+  +----------+      |   +-------------------+   |  tty3  |<---------->| User processes |                    |                           +--------+    |       +----------------+                    |                                         |                    +-----------------------------------------+

鍵盤、顯示器都和內(nèi)核中的終端模擬器相連,由模擬器決定創(chuàng)建多少tty,比如你在鍵盤上輸入ctrl+alt+F1時(shí),模擬器首先捕獲到該輸入,然后激活tty1,這樣鍵盤的輸入會(huì)轉(zhuǎn)發(fā)到tty1,而tty1的輸出會(huì)轉(zhuǎn)發(fā)到顯示器,同理用輸入ctrl+alt+F2,就會(huì)切換到tty2。

當(dāng)模擬器激活tty時(shí)如果發(fā)現(xiàn)沒有進(jìn)程與之關(guān)聯(lián),意味著這是第一次打開該tty,于是會(huì)啟動(dòng)配置好的進(jìn)程并和該tty綁定,一般該進(jìn)程就是負(fù)責(zé)login的進(jìn)程。

當(dāng)切換到tty2后,tty1里面的輸出會(huì)輸出到哪里呢?tty1的輸出還是會(huì)輸出給模擬器,模擬器里會(huì)有每個(gè)tty的緩存,不過由于模擬器的緩存空間有限,所以下次切回tty1的時(shí)候,只能看到最新的輸出,以前的輸出已經(jīng)不在了。

不確定這里的終端模擬器對(duì)應(yīng)內(nèi)核中具體的哪個(gè)模塊,但肯定有這么個(gè)東西存在

SSH遠(yuǎn)程訪問

 +----------+       +------------+  | Keyboard |------>|            |  +----------+       |  Terminal  |  | Monitor  |<------|            |  +----------+       +------------+                           |                           |  ssh protocol                           |                           ↓                     +------------+                     |            |                     | ssh server |--------------------------+                     |            |           fork           |                     +------------+                          |                         |   ↑                               |                         |   |                               |                   write |   | read                          |                         |   |                               |                   +-----|---|-------------------+           |                   |     |   |                   |           ↓                   |     ↓   |      +-------+    |       +-------+                   |   +--------+   | pts/0 |<---------->| shell |                   |   |        |   +-------+    |       +-------+                   |   |  ptmx  |<->| pts/1 |<---------->| shell |                   |   |        |   +-------+    |       +-------+                   |   +--------+   | pts/2 |<---------->| shell |                   |                +-------+    |       +-------+                   |    Kernel                   |                   +-----------------------------+

這里的Terminal可能是任何地方的程序,比如windows上的putty,所以不討論客戶端的Terminal程序是怎么和鍵盤、顯示器交互的。由于Terminal要和ssh服務(wù)器打交道,所以肯定要實(shí)現(xiàn)ssh的客戶端功能。

這里將建立連接和收發(fā)數(shù)據(jù)分兩條線路解釋,為了描述簡潔,這里以sshd代替ssh服務(wù)器程序:

建立連接

  • 1.Terminal請求和sshd建立連接

  • 2.如果驗(yàn)證通過,sshd將創(chuàng)建一個(gè)新的session

  • 3.調(diào)用API(posix_openpt())請求ptmx創(chuàng)建一個(gè)pts,創(chuàng)建成功后,sshd將得到和ptmx關(guān)聯(lián)的fd,并將該fd和session關(guān)聯(lián)起來。

#pty(pseudo terminal device)由兩部分構(gòu)成,ptmx是master端,pts是slave端, #進(jìn)程可以通過調(diào)用API請求ptmx創(chuàng)建一個(gè)pts,然后將會(huì)得到連接到ptmx的讀寫fd和一個(gè)新創(chuàng)建的pts, #ptmx在內(nèi)部會(huì)維護(hù)該fd和pts的對(duì)應(yīng)關(guān)系,隨后往這個(gè)fd的讀寫會(huì)被ptmx轉(zhuǎn)發(fā)到對(duì)應(yīng)的pts。  #這里可以看到sshd已經(jīng)打開了/dev/ptmx dev@debian:~$ sudo lsof /dev/ptmx COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME sshd    1191  dev    8u   CHR    5,2      0t0 6531 /dev/ptmx sshd    1191  dev   10u   CHR    5,2      0t0 6531 /dev/ptmx sshd    1191  dev   11u   CHR    5,2      0t0 6531 /dev/ptmx
  • 4.同時(shí)sshd創(chuàng)建shell進(jìn)程,將新創(chuàng)建的pts和shell綁定

收發(fā)消息

  • 1.Terminal收到鍵盤的輸入,Terminal通過ssh協(xié)議將數(shù)據(jù)發(fā)往sshd

  • 2.sshd收到客戶端的數(shù)據(jù)后,根據(jù)它自己管理的session,找到該客戶端對(duì)應(yīng)的關(guān)聯(lián)到ptmx上的fd

  • 3.往找到的fd上寫入客戶端發(fā)過來的數(shù)據(jù)

  • 4.ptmx收到數(shù)據(jù)后,根據(jù)fd找到對(duì)應(yīng)的pts(該對(duì)應(yīng)關(guān)系由ptmx自動(dòng)維護(hù)),將數(shù)據(jù)包轉(zhuǎn)發(fā)給對(duì)應(yīng)的pts

  • 5.pts收到數(shù)據(jù)包后,檢查綁定到自己上面的當(dāng)前前端進(jìn)程組,將數(shù)據(jù)包發(fā)給該進(jìn)程組的leader

  • 6.由于pts上只有shell,所以shell的read函數(shù)就收到了該數(shù)據(jù)包

  • 7.shell對(duì)收到的數(shù)據(jù)包進(jìn)行處理,然后輸出處理結(jié)果(也可能沒有輸出)

  • 8.shell通過write函數(shù)將結(jié)果寫入pts

  • 9.pts將結(jié)果轉(zhuǎn)發(fā)給ptmx

  • 10.ptmx根據(jù)pts找到對(duì)應(yīng)的fd,往該fd寫入結(jié)果

  • 11.sshd收到該fd的結(jié)果后,找到對(duì)應(yīng)的session,然后將結(jié)果發(fā)給對(duì)應(yīng)的客戶端

鍵盤顯示器直連(圖形界面)

 +----------+       +------------+  | Keyboard |------>|            |  +----------+       |  Terminal  |--------------------------+  | Monitor  |<------|            |           fork           |  +----------+       +------------+                          |                         |   ↑                               |                         |   |                               |                   write |   | read                          |                         |   |                               |                   +-----|---|-------------------+           |                   |     |   |                   |           ↓                   |     ↓   |      +-------+    |       +-------+                   |   +--------+   | pts/0 |<---------->| shell |                   |   |        |   +-------+    |       +-------+                   |   |  ptmx  |<->| pts/1 |<---------->| shell |                   |   |        |   +-------+    |       +-------+                   |   +--------+   | pts/2 |<---------->| shell |                   |                +-------+    |       +-------+                   |    Kernel                   |                   +-----------------------------+

為了簡化起見,本篇不討論Linux下圖形界面里Terminal程序是怎么和鍵盤、顯示器交互的。

這里和上面的不同點(diǎn)就是,這里的Terminal不需要實(shí)現(xiàn)ssh客戶端,但需要把ssh服務(wù)器要干的活也干了(當(dāng)然ssh通信相關(guān)的除外)。

SSH + Screen/Tmux

常用Linux的同學(xué)應(yīng)該對(duì)screen和tmux不陌生,通過它們啟動(dòng)的進(jìn)程,就算網(wǎng)絡(luò)斷開了,也不會(huì)受到影響繼續(xù)執(zhí)行,下次連上去時(shí)還能看到進(jìn)程的所有輸出,還能繼續(xù)接著干活。

這里以tmux為例介紹其原理:

 +----------+       +------------+  | Keyboard |------>|            |  +----------+       |  Terminal  |  | Monitor  |<------|            |  +----------+       +------------+                           |                           |  ssh protocol                           |                           ↓                     +------------+                     |            |                     | ssh server |--------------------------+                     |            |           fork           |                     +------------+                          |                         |   ↑                               |                         |   |                               |                   write |   | read                          |                         |   |                               |                   +-----|---|-------------------+           |                   |     ↓   |                   |           ↓                   |   +--------+   +-------+    |       +-------+  fork   +-------------+                   |   |  ptmx  |<->| pts/0 |<---------->| shell |-------->| tmux client |                   |   +--------+   +-------+    |       +-------+         +-------------+                   |   |        |                |                               ↑                   |   +--------+   +-------+    |       +-------+               |                   |   |  ptmx  |<->| pts/2 |<---------->| shell |               |                   |   +--------+   +-------+    |       +-------+               |                   |     ↑   |  Kernel           |           ↑                   |                   +-----|---|-------------------+           |                   |                         |   |                               |                   |                         |w/r|   +---------------------------+                   |                         |   |   |            fork                               |                         |   ↓   |                                               |                     +-------------+                                             |                     |             |                                             |                     | tmux server |<--------------------------------------------+                     |             |                     +-------------+

系統(tǒng)中的ptmx只有一個(gè),上圖中畫出來了兩個(gè),目的是為了表明tmux服務(wù)器和sshd都用ptmx,但它們之間又互不干涉。

這種情況要稍微復(fù)雜一點(diǎn),不過原理都是一樣的,前半部分和普通ssh的方式是一樣的,只是pts/0關(guān)聯(lián)的前端進(jìn)程不是shell了,而是變成了tmux客戶端,所以ssh客戶端發(fā)過來的數(shù)據(jù)包都會(huì)被tmux客戶端收到,然后由tmux客戶端轉(zhuǎn)發(fā)給tmux服務(wù)器,而tmux服務(wù)器干的活和ssh的類似,也是維護(hù)一堆的session,為每個(gè)session創(chuàng)建一個(gè)pts,然后將tmux客戶端發(fā)過來的數(shù)據(jù)轉(zhuǎn)發(fā)給相應(yīng)的pts。

由于tmux服務(wù)器只和tmux客戶端打交道,和sshd沒有關(guān)系,當(dāng)終端和sshd的連接斷開時(shí),雖然pts/0會(huì)被關(guān)閉,和它相關(guān)的shell和tmux客戶端也將被kill掉,但不會(huì)影響tmux服務(wù)器,當(dāng)下次再用tmux客戶端連上tmux服務(wù)器時(shí),看到的還是上次的內(nèi)容。

TTY和PTS的區(qū)別

從上面的流程中應(yīng)該可以看出來了,對(duì)用戶空間的程序來說,他們沒有區(qū)別,都是一樣的;從內(nèi)核里面來看,pts的另一端連接的是ptmx,而tty的另一端連接的是內(nèi)核的終端模擬器,ptmx和終端模擬器都只是負(fù)責(zé)維護(hù)會(huì)話和轉(zhuǎn)發(fā)數(shù)據(jù)包;再看看ptmx和內(nèi)核終端模擬器的另一端,ptmx的另一端連接的是用戶空間的應(yīng)用程序,如sshd、tmux等,而內(nèi)核終端模擬器的另一端連接的是具體的硬件,如鍵盤和顯示器。

常見的TTY配置

先先來看看當(dāng)前tty的所有配置:

dev@dev:~$ stty -a speed 38400 baud; rows 51; columns 204; line = 0; intr = ^C; quit = ^; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0; -parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc ixany imaxbel -iutf8 opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc

stty還可以用來修改tty的參數(shù),用法請參考man stty

只要是有權(quán)限的程序,都可以通過Linux提供的API來修改TTY的配置,下面介紹一些常見的的配置項(xiàng)。

rows 51; columns 204;

這個(gè)配置一般由終端控制,當(dāng)終端的窗口大小發(fā)生變化時(shí),需要通過一定的手段修改該配置,比如ssh協(xié)議里面就有修改窗口大小的參數(shù),sshd收到客戶端的請求后,會(huì)通過API修改tty的這個(gè)參數(shù),然后由tty通過信號(hào)SIGWINCH通知前端程序(比如shell或者vim),前端程序收到信號(hào)后,再去讀tty的這個(gè)參數(shù),然后就知道如何調(diào)整自己的輸出排版了。

intr = ^C

tty除了在終端和前端進(jìn)程之間轉(zhuǎn)發(fā)數(shù)據(jù)之外,還支持很多控制命令,比如終端輸入了CTRL+C,那么tty不會(huì)將該輸入串轉(zhuǎn)發(fā)給前端進(jìn)程,而是將它轉(zhuǎn)換成信號(hào)SIGINT發(fā)送給前端進(jìn)程。這個(gè)就是用來配置控制命令對(duì)應(yīng)的輸入組合的,比如我們可以配置“intr = ^E”表示用CTRL+E代替CTRL+C。

start = ^Q; stop = ^S;

這是兩個(gè)特殊的控制命令,估計(jì)經(jīng)常有人會(huì)碰到,在鍵盤上不小心輸入CTRL+S后,終端沒反應(yīng)了,即沒輸出,也不響應(yīng)任何輸入。這是因?yàn)檫@個(gè)命令會(huì)告訴TTY暫停,阻塞所有讀寫操作,即不轉(zhuǎn)發(fā)任何數(shù)據(jù),只有按了CTRL+Q后,才會(huì)繼續(xù)。這個(gè)功能應(yīng)該是歷史遺留,以前終端和服務(wù)器之間沒有流量控制功能,所以有可能服務(wù)器發(fā)送數(shù)據(jù)過快,導(dǎo)致終端處理不過來,于是需要這樣一個(gè)命令告訴服務(wù)器不要再發(fā)了,等終端處理完了后在通知服務(wù)器繼續(xù)。

該命令現(xiàn)在比較常用的一個(gè)場景就是用tail -f命令監(jiān)控日志文件的內(nèi)容時(shí),可以隨時(shí)按CTRL+S讓屏幕停止刷新,看完后再按CTRL+Q讓它繼續(xù)刷,如果不這樣的話,需要先CTRL+C退出,看完后在重新運(yùn)行tail -f命令。

echo

在終端輸入字符的時(shí)候,之所以我們能及時(shí)看到我們輸入的字符,那是因?yàn)門TY在收到終端發(fā)過去的字符后,會(huì)先將字符原路返回一份,然后才交給前端進(jìn)程處理,這樣終端就能及時(shí)的顯示輸入的字符。echo就是用來控制該功能的配置項(xiàng),如果是-echo的話表示disable echo功能。

-tostop

如果你在shell中運(yùn)行程序的時(shí)候,后面添加了&,比如./myapp &,這樣myapp這個(gè)進(jìn)程就會(huì)在后臺(tái)運(yùn)行,但如果這個(gè)進(jìn)程繼續(xù)往tty上寫數(shù)據(jù)呢?這個(gè)參數(shù)就用來控制是否將輸出轉(zhuǎn)發(fā)給終端,也即結(jié)果會(huì)不會(huì)在終端顯示,這里“-tostop”表示會(huì)輸出到終端,如果配置為“tostop”的話,將不輸出到終端,并且tty會(huì)發(fā)送信號(hào)SIGTTOU給myapp,該信號(hào)的默認(rèn)行為是將暫停myapp的執(zhí)行。

TTY相關(guān)信號(hào)

除了上面介紹配置時(shí)提到的SIGINT,SIGTTOU,SIGWINCHU外,還有這么幾個(gè)跟TTY相關(guān)的信號(hào)

SIGTTIN

當(dāng)后臺(tái)進(jìn)程讀tty時(shí),tty將發(fā)送該信號(hào)給相應(yīng)的進(jìn)程組,默認(rèn)行為是暫停進(jìn)程組中進(jìn)程的執(zhí)行。暫停的進(jìn)程如何繼續(xù)執(zhí)行呢?請參考下一篇文章中的SIGCONT。

SIGHUP

當(dāng)tty的另一端掛掉的時(shí)候,比如ssh的session斷開了,于是sshd關(guān)閉了和ptmx關(guān)聯(lián)的fd,內(nèi)核將會(huì)給和該tty相關(guān)的所有進(jìn)程發(fā)送SIGHUP信號(hào),進(jìn)程收到該信號(hào)后的默認(rèn)行為是退出進(jìn)程。

SIGTSTP

終端輸入CTRL+Z時(shí),tty收到后就會(huì)發(fā)送SIGTSTP給前端進(jìn)程組,其默認(rèn)行為是將前端進(jìn)程組放到后端,并且暫停進(jìn)程組里所有進(jìn)程的執(zhí)行。

跟tty相關(guān)的信號(hào)都是可以捕獲的,可以修改它的默認(rèn)行為

結(jié)束語

本文介紹了常見的tty功能和特點(diǎn),下一篇中將詳細(xì)介紹和tty密切相關(guān)的進(jìn)程session id,進(jìn)程組,job,后臺(tái)程序等,敬請期待。

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
最新亚洲国产| 樱桃视频成人在线观看| 尤物在线精品| 国产免费成人| 美国三级日本三级久久99| 日韩精品一级二级| 日韩欧美美女在线观看| 欧美日韩中文| 精品视频国内| 亚洲成人二区| 久久精品青草| 亚洲欧美日韩专区| 日本99精品| 久久亚洲黄色| 久久精品二区三区| 老司机久久99久久精品播放免费| 亚洲日产国产精品| 久久香蕉精品香蕉| 国产精品88久久久久久| 亚洲人亚洲人色久| 国产乱码精品一区二区三区亚洲人 | 日本成人在线视频网站| 日韩av三区| 国产一区2区| 亚洲精品电影| 国产精品中文字幕制服诱惑| 日韩在线第七页| 丝袜a∨在线一区二区三区不卡| 国产精品亚洲产品| 久久精品影视| 国产欧美自拍一区| 久久精品高清| 91av一区| 亚洲午夜一级| 国产毛片久久久| 日韩欧美精品| 日本不卡视频一二三区| 日韩成人精品一区二区| 亚洲一区二区三区免费在线观看| 国产精品一区高清| 在线亚洲成人| 欧美xxxx中国| 91精品一区| 伊人久久亚洲热| 蜜桃精品视频| 中文字幕一区二区三区在线视频| 国产一区二区三区天码| 亚洲精品乱码久久久久久蜜桃麻豆 | 日韩大片免费观看| 亚洲影院天堂中文av色| 综合日韩av| 奇米色欧美一区二区三区| 久久人人99| 成人污污视频| 亚洲精品少妇| 亚洲在线成人| 色88888久久久久久影院| 国产探花一区在线观看| 久久国产精品亚洲77777| 日韩一区二区三区免费| 免费在线日韩av| 亚洲三区欧美一区国产二区| 99精品一区| 水蜜桃久久夜色精品一区| 久久国产人妖系列| 中文字幕亚洲精品乱码| 激情欧美国产欧美| 国产黄大片在线观看| 国产欧美69| 日本中文字幕一区二区视频| 午夜国产精品视频免费体验区| 国产精品久久观看| 欧美成人精品一级| 7m精品国产导航在线| 天堂av在线一区| 136国产福利精品导航网址| 国产精品videosex极品| 日韩和欧美的一区| 中文一区一区三区免费在线观 | 激情偷拍久久| 成人美女视频| 福利一区二区三区视频在线观看| 欧美一区精品| 青草av.久久免费一区| 日韩久久99| 日韩欧美在线精品| 日韩精品中文字幕一区二区| 四虎在线精品| 欧美日韩99| 久久国产视频网| 国产精品日本一区二区不卡视频| 国产美女亚洲精品7777| 精品国产一区二区三区av片| 久久精品国产一区二区| 国产精品亚洲一区二区在线观看| 国产欧美大片| 国产一区二区三区不卡视频网站 | 日本a级不卡| 欧美日韩18| 国产精品美女久久久久久不卡| 久久国产尿小便嘘嘘| 美女久久精品| 国产在线一区不卡| 中文在线а√天堂| 免费毛片在线不卡| 午夜在线播放视频欧美| 亚洲免费一区三区| 日韩久久一区| 精品视频免费| 欧美成人基地| 欧美日韩一二三四| 丝袜美腿成人在线| 国产美女撒尿一区二区| 国产一区二区三区网| 亚洲成av在线| 鲁大师成人一区二区三区| 亚洲无线观看| 国产精品视频一区二区三区| 中文字幕在线官网| 亚洲欧美久久久| 国产精品日韩精品中文字幕| 日韩免费久久| 国产一区91| 欧美久久久网站| 日韩伦理福利| 亚洲九九精品| 成人高清一区| 欧美综合国产| 国产精品网在线观看| 日韩av福利| 免费观看在线综合| 精品日本视频| 亚洲激情婷婷| 国产精品3区| 亚洲精品极品少妇16p| 欧美视频久久| 999国产精品视频| 综合视频一区| 蜜臀国产一区| 日本v片在线高清不卡在线观看| 精品亚洲二区| 蜜臀精品久久久久久蜜臀| 国产精品s色| 欧美日韩一二三四| 国产日韩欧美高清免费| 99精品在线观看| 国产精久久一区二区| 欧美另类综合| 久久久精品国产**网站| 国产精品日本| 国产精品久久久久久久久妇女| 蜜臀av在线播放一区二区三区| 久久亚洲精品中文字幕| 美女网站久久| 日韩大片在线| 国产日韩在线观看视频| 国产亚洲网站| 亚洲精品在线影院| 国产乱子精品一区二区在线观看| 亚洲午夜视频| 精品国产一区二区三区噜噜噜| 亚洲免费在线| 美女一区网站| 免费日韩成人| 日韩精品久久理论片| 亚洲性色视频| 黄毛片在线观看| 日韩国产在线不卡视频| 成人av二区| a日韩av网址| 国产极品一区| 综合国产精品| 亚洲精品91| 亚洲成人不卡| 粉嫩av一区二区三区四区五区 | 国产伦理一区| 亚洲一区二区av| 国产综合亚洲精品一区二| 欧美91在线|欧美| 日韩激情一二三区| 羞羞答答国产精品www一本| 久久青青视频| 国产精品成人自拍| 中文字幕日韩亚洲| 午夜国产精品视频| 四虎884aa成人精品最新| 欧美国产精品| 国产伦精品一区二区三区视频| 久久亚洲欧美| 91久久午夜| 91精品电影| 亚洲国内精品| 香蕉久久精品| 日韩一区自拍| 日韩在线精品| 亚洲成人国产| 欧美福利专区| 日韩中文在线电影| 天堂网av成人| 亚洲特色特黄|