掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢(xún)/運(yùn)營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流
當(dāng)我們?cè)阪I盤(pán)上敲下一個(gè)字母的時(shí)候,到底是怎么發(fā)送到相應(yīng)的進(jìn)程的呢?我們通過(guò)ps、who等命令看到的類(lèi)似TTY1、pts/0這樣的輸出,它們的作用和區(qū)別是什么呢?

創(chuàng)新互聯(lián)-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性?xún)r(jià)比雙柏網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式雙柏網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋雙柏地區(qū)。費(fèi)用合理售后完善,十多年實(shí)體公司更值得信賴(lài)。
TTY歷史
支持多任務(wù)的計(jì)算機(jī)出現(xiàn)之前
在計(jì)算機(jī)出來(lái)以前,人們就已經(jīng)在使用一種叫teletype的設(shè)備,用來(lái)相互之間傳遞信息,看起來(lái)像下面這樣:
+———-+ Physical Line +———-+
| teletype |<———————>| teletype |
+———-+ +———-+
兩個(gè)teletype之間用線連接起來(lái),線兩端可能也有類(lèi)似于調(diào)制解調(diào)器之類(lèi)的設(shè)備(這里將它們忽略),在一端的teletype上敲鍵盤(pán)時(shí),相應(yīng)的數(shù)據(jù)會(huì)發(fā)送到另一端的teletype,具體功能是干什么的,我也不太了解。(我腦袋里面想到畫(huà)面是在一端敲字,另一端打印出來(lái))
這些都是老古董了,完全沒(méi)接觸過(guò),所以只能簡(jiǎn)單的推測(cè)。
支持多任務(wù)的計(jì)算機(jī)出現(xiàn)之后
等到計(jì)算機(jī)支持多任務(wù)后,人們想到把這些teletype連到計(jì)算機(jī)上,作為計(jì)算機(jī)的終端,從而可以操作計(jì)算機(jī)。
使用teletype的主要原因有兩個(gè)(個(gè)人見(jiàn)解):
于是連接就發(fā)展成這樣:
+———-+
+———-+ +——-+ Physical Line +——-+ +——+ | |
| Terminal |<->| Modem |<———————>| Modem |<->| UART |<->| Computer |
+———-+ +——-+ +——-+ +——+ | |
+———-+
內(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 |
| +——–+ +————+ | | | +—————-+
| +——–+ |
| |
+———————————————–+
為了簡(jiǎn)單起見(jiàn),后面的介紹中不再單獨(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è)終端連接過(guò)來(lái),那么看起來(lái)就是這個(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è)備名稱(chēng)叫ttyS0是因?yàn)榇蟛糠纸K端的連接都是串行連接),由于每個(gè)終端可能都不一樣,有自己的特殊命令和使用習(xí)慣,于是每個(gè)tty設(shè)備的配置可能都不一樣。比如按delete鍵的時(shí)候,有些可能是要?jiǎng)h前面的字符,而有些可能是刪后面的,如果沒(méi)配置對(duì),就會(huì)導(dǎo)致某些按鍵不是自己想要的行為,這也是我們?cè)谑褂媚M終端時(shí),如果默認(rèn)的配置跟我們的習(xí)慣不符,需要做一些個(gè)性化配置的原因。
后來(lái)隨著計(jì)算機(jī)的不斷發(fā)展,teletype這些設(shè)備逐漸消失,我們不再需要專(zhuān)門(mén)的終端設(shè)備了,每個(gè)機(jī)器都有自己的鍵盤(pán)和顯示器,每臺(tái)機(jī)器都可以是其它機(jī)器的終端,遠(yuǎn)程的操作通過(guò)ssh來(lái)實(shí)現(xiàn),但是內(nèi)核TTY驅(qū)動(dòng)這一架構(gòu)沒(méi)有發(fā)生變化,我們想要和系統(tǒng)中的進(jìn)程進(jìn)行I/O交互,還是需要通過(guò)TTY設(shè)備,于是出現(xiàn)了各種終端模擬軟件,并且模擬的也是常見(jiàn)的幾種終端,如VT100、VT220、XTerm等。
程序如何和TTY打交道
在討論TTY設(shè)備是如何被創(chuàng)建及配置之前,我們先來(lái)看看TTY是如何被進(jìn)程使用的:
#先用tty命令看看當(dāng)前bash關(guān)聯(lián)到了哪個(gè)tty
dev@debian:~$ tty
/dev/pts/1
#看tty都被哪些進(jìn)程打開(kāi)了
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里面直接寫(xiě)數(shù)據(jù)跟寫(xiě)標(biāo)準(zhǔn)輸出是一樣的效果
dev@dev:~$ echo aaa > /dev/pts/2
aaa
pts也是tty設(shè)備,它們的關(guān)系后面會(huì)介紹到
通過(guò)上面的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 +——+
+————————–+
從上面可以看出,進(jìn)程和tty打交道很簡(jiǎn)單,只要保證后臺(tái)進(jìn)程不要讀寫(xiě)tty就可以了,即寫(xiě)后臺(tái)程序時(shí),要將stdin/stdout/stderr重定向到其它地方(當(dāng)然deamon程序還需要做很多其它處理)。
先拋出兩個(gè)問(wèn)題(后面有答案):
TTY是如何被創(chuàng)建的
下面介紹幾種常見(jiàn)的情況下tty設(shè)備是如何創(chuàng)建的,以及input和output設(shè)備都是啥。
鍵盤(pán)顯示器直連(終端)
先看圖再說(shuō)話:
+—————————————–+
| Kernel |
| +——–+ | +—————-+
+———-+ | +——————-+ | tty1 |<———->| User processes |
| Keyboard |———>| | +——–+ | +—————-+
+———-+ | | Terminal Emulator |<->| tty2 |<———->| User processes |
| Monitor |<———| | +——–+ | +—————-+
+———-+ | +——————-+ | tty3 |<———->| User processes |
| +——–+ | +—————-+
| |
+—————————————–+
鍵盤(pán)、顯示器都和內(nèi)核中的終端模擬器相連,由模擬器決定創(chuàng)建多少tty,比如你在鍵盤(pán)上輸入ctrl+alt+F1時(shí),模擬器首先捕獲到該輸入,然后激活tty1,這樣鍵盤(pán)的輸入會(huì)轉(zhuǎn)發(fā)到tty1,而tty1的輸出會(huì)轉(zhuǎn)發(fā)到顯示器,同理用輸入ctrl+alt+F2,就會(huì)切換到tty2。
當(dāng)模擬器激活tty時(shí)如果發(fā)現(xiàn)沒(méi)有進(jìn)程與之關(guān)聯(lián),意味著這是第一次打開(kāi)該tty,于是會(huì)啟動(dòng)配置好的進(jìn)程并和該tty綁定,一般該進(jìn)程就是負(fù)責(zé)login的進(jìn)程。
當(dāng)切換到tty2后,tty1里面的輸出會(huì)輸出到哪里呢?tty1的輸出還是會(huì)輸出給模擬器,模擬器里會(huì)有每個(gè)tty的緩存,不過(guò)由于模擬器的緩存空間有限,所以下次切回tty1的時(shí)候,只能看到最新的輸出,以前的輸出已經(jīng)不在了。
不確定這里的終端模擬器對(duì)應(yīng)內(nèi)核中具體的哪個(gè)模塊,但肯定有這么個(gè)東西存在
SSH遠(yuǎn)程訪問(wè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,所以不討論客戶(hù)端的Terminal程序是怎么和鍵盤(pán)、顯示器交互的。由于Terminal要和ssh服務(wù)器打交道,所以肯定要實(shí)現(xiàn)ssh的客戶(hù)端功能。
這里將建立連接和收發(fā)數(shù)據(jù)分兩條線路解釋?zhuān)瑸榱嗣枋龊?jiǎn)潔,這里以sshd代替ssh服務(wù)器程序:
建立連接
1.Terminal請(qǐng)求和sshd建立連接
2.如果驗(yàn)證通過(guò),sshd將創(chuàng)建一個(gè)新的session
3.調(diào)用API(posix_openpt())請(qǐng)求ptmx創(chuàng)建一個(gè)pts,創(chuàng)建成功后,sshd將得到和ptmx關(guān)聯(lián)的fd,并將該fd和session關(guān)聯(lián)起來(lái)。
#pty(pseudo terminal device)由兩部分構(gòu)成,ptmx是master端,pts是slave端, #進(jìn)程可以通過(guò)調(diào)用API請(qǐng)求ptmx創(chuàng)建一個(gè)pts,然后將會(huì)得到連接到ptmx的讀寫(xiě)fd和一個(gè)新創(chuàng)建的pts, #ptmx在內(nèi)部會(huì)維護(hù)該fd和pts的對(duì)應(yīng)關(guān)系,隨后往這個(gè)fd的讀寫(xiě)會(huì)被ptmx轉(zhuǎn)發(fā)到對(duì)應(yīng)的pts。 #這里可以看到sshd已經(jīng)打開(kāi)了/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收到鍵盤(pán)的輸入,Terminal通過(guò)ssh協(xié)議將數(shù)據(jù)發(fā)往sshd
2.sshd收到客戶(hù)端的數(shù)據(jù)后,根據(jù)它自己管理的session,找到該客戶(hù)端對(duì)應(yīng)的關(guān)聯(lián)到ptmx上的fd
3.往找到的fd上寫(xiě)入客戶(hù)端發(fā)過(guò)來(lái)的數(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é)果(也可能沒(méi)有輸出)
8.shell通過(guò)write函數(shù)將結(jié)果寫(xiě)入pts
9.pts將結(jié)果轉(zhuǎn)發(fā)給ptmx
10.ptmx根據(jù)pts找到對(duì)應(yīng)的fd,往該fd寫(xiě)入結(jié)果
11.sshd收到該fd的結(jié)果后,找到對(duì)應(yīng)的session,然后將結(jié)果發(fā)給對(duì)應(yīng)的客戶(hù)端
鍵盤(pán)顯示器直連(圖形界面)
+———-+ +————+
| Keyboard |——>| |
+———-+ | Terminal |————————–+
| Monitor |<——| | fork |
+———-+ +————+ |
| ↑ |
| | |
write | | read |
| | |
+—–|—|——————-+ |
| | | | ↓
| ↓ | +——-+ | +——-+
| +——–+ | pts/0 |<———->| shell |
| | | +——-+ | +——-+
| | ptmx |<->| pts/1 |<———->| shell |
| | | +——-+ | +——-+
| +——–+ | pts/2 |<———->| shell |
| +——-+ | +——-+
| Kernel |
+—————————–+
為了簡(jiǎn)化起見(jiàn),本篇不討論linux下圖形界面里Terminal程序是怎么和鍵盤(pán)、顯示器交互的。
這里和上面的不同點(diǎn)就是,這里的Terminal不需要實(shí)現(xiàn)ssh客戶(hù)端,但需要把ssh服務(wù)器要干的活也干了(當(dāng)然ssh通信相關(guān)的除外)。
SSH + Screen/Tmux
常用Linux的同學(xué)應(yīng)該對(duì)screen和tmux不陌生,通過(guò)它們啟動(dòng)的進(jìn)程,就算網(wǎng)絡(luò)斷開(kāi)了,也不會(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è),上圖中畫(huà)出來(lái)了兩個(gè),目的是為了表明tmux服務(wù)器和sshd都用ptmx,但它們之間又互不干涉。
這種情況要稍微復(fù)雜一點(diǎn),不過(guò)原理都是一樣的,前半部分和普通ssh的方式是一樣的,只是pts/0關(guān)聯(lián)的前端進(jìn)程不是shell了,而是變成了tmux客戶(hù)端,所以ssh客戶(hù)端發(fā)過(guò)來(lái)的數(shù)據(jù)包都會(huì)被tmux客戶(hù)端收到,然后由tmux客戶(hù)端轉(zhuǎn)發(fā)給tmux服務(wù)器,而tmux服務(wù)器干的活和ssh的類(lèi)似,也是維護(hù)一堆的session,為每個(gè)session創(chuàng)建一個(gè)pts,然后將tmux客戶(hù)端發(fā)過(guò)來(lái)的數(shù)據(jù)轉(zhuǎn)發(fā)給相應(yīng)的pts。
由于tmux服務(wù)器只和tmux客戶(hù)端打交道,和sshd沒(méi)有關(guān)系,當(dāng)終端和sshd的連接斷開(kāi)時(shí),雖然pts/0會(huì)被關(guān)閉,和它相關(guān)的shell和tmux客戶(hù)端也將被kill掉,但不會(huì)影響tmux服務(wù)器,當(dāng)下次再用tmux客戶(hù)端連上tmux服務(wù)器時(shí),看到的還是上次的內(nèi)容。
TTY和PTS的區(qū)別
從上面的流程中應(yīng)該可以看出來(lái)了,對(duì)用戶(hù)空間的程序來(lái)說(shuō),他們沒(méi)有區(qū)別,都是一樣的;從內(nèi)核里面來(lái)看,pts的另一端連接的是ptmx,而tty的另一端連接的是內(nèi)核的終端模擬器,ptmx和終端模擬器都只是負(fù)責(zé)維護(hù)會(huì)話和轉(zhuǎn)發(fā)數(shù)據(jù)包;再看看ptmx和內(nèi)核終端模擬器的另一端,ptmx的另一端連接的是用戶(hù)空間的應(yīng)用程序,如sshd、tmux等,而內(nèi)核終端模擬器的另一端連接的是具體的硬件,如鍵盤(pán)和顯示器。
常見(jiàn)的TTY配置
先先來(lái)看看當(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 =; 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還可以用來(lái)修改tty的參數(shù),用法請(qǐng)參考man stty
只要是有權(quán)限的程序,都可以通過(guò)Linux提供的API來(lái)修改TTY的配置,下面介紹一些常見(jiàn)的的配置項(xiàng)。
rows 51; columns 204;
這個(gè)配置一般由終端控制,當(dāng)終端的窗口大小發(fā)生變化時(shí),需要通過(guò)一定的手段修改該配置,比如ssh協(xié)議里面就有修改窗口大小的參數(shù),sshd收到客戶(hù)端的請(qǐng)求后,會(huì)通過(guò)API修改tty的這個(gè)參數(shù),然后由tty通過(guò)信號(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è)就是用來(lái)配置控制命令對(duì)應(yīng)的輸入組合的,比如我們可以配置“intr = ^E”表示用CTRL+E代替CTRL+C。
start = ^Q; stop = ^S;
這是兩個(gè)特殊的控制命令,估計(jì)經(jīng)常有人會(huì)碰到,在鍵盤(pán)上不小心輸入CTRL+S后,終端沒(méi)反應(yīng)了,即沒(méi)輸出,也不響應(yīng)任何輸入。這是因?yàn)檫@個(gè)命令會(huì)告訴TTY暫停,阻塞所有讀寫(xiě)操作,即不轉(zhuǎn)發(fā)任何數(shù)據(jù),只有按了CTRL+Q后,才會(huì)繼續(xù)。這個(gè)功能應(yīng)該是歷史遺留,以前終端和服務(wù)器之間沒(méi)有流量控制功能,所以有可能服務(wù)器發(fā)送數(shù)據(jù)過(guò)快,導(dǎo)致終端處理不過(guò)來(lái),于是需要這樣一個(gè)命令告訴服務(wù)器不要再發(fā)了,等終端處理完了后在通知服務(wù)器繼續(xù)。
該命令現(xiàn)在比較常用的一個(gè)場(chǎng)景就是用tail -f命令監(jiān)控日志文件的內(nèi)容時(shí),可以隨時(shí)按CTRL+S讓屏幕停止刷新,看完后再按CTRL+Q讓它繼續(xù)刷,如果不這樣的話,需要先CTRL+C退出,看完后在重新運(yùn)行tail -f命令。
echo
在終端輸入字符的時(shí)候,之所以我們能及時(shí)看到我們輸入的字符,那是因?yàn)門(mén)TY在收到終端發(fā)過(guò)去的字符后,會(huì)先將字符原路返回一份,然后才交給前端進(jìn)程處理,這樣終端就能及時(shí)的顯示輸入的字符。echo就是用來(lái)控制該功能的配置項(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上寫(xiě)數(shù)據(jù)呢?這個(gè)參數(shù)就用來(lái)控制是否將輸出轉(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í)行呢?請(qǐng)參考下一篇文章中的SIGCONT。
SIGHUP
當(dāng)tty的另一端掛掉的時(shí)候,比如ssh的session斷開(kāi)了,于是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é)束語(yǔ)
本文介紹了常見(jiàn)的tty功能和特點(diǎn),下一篇中將詳細(xì)介紹和tty密切相關(guān)的進(jìn)程session id,進(jìn)程組,job,后臺(tái)程序等,敬請(qǐng)期待。
參考
The TTY demystified
本篇文章到此結(jié)束,如果您有相關(guān)技術(shù)方面疑問(wèn)可以聯(lián)系我們技術(shù)人員遠(yuǎn)程解決,感謝大家支持本站!
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開(kāi)通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn)。專(zhuān)業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢(xún)/運(yùn)營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流