日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

解密TTY

發(fā)布時(shí)間:2023/12/10 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 解密TTY 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文內(nèi)容來(lái)自The TTY demystified?,講述了*NIX系統(tǒng)中TTY的歷史與工作原理,看完后解決了我很多疑惑,于是做此翻譯,與大家分享。


譯者:李秋豪?江家偉

審校:

V1.0 Sun May 13 12:42:01 CST 2018

一直以來(lái),TTY子系統(tǒng)都是Linux/Unix設(shè)計(jì)中的一個(gè)關(guān)鍵點(diǎn)。不幸的是,這種重要性通常都被忽略了,并且也很難找到相關(guān)的介紹性文章。我認(rèn)為,對(duì)Linux中TTYs的基礎(chǔ)知識(shí)理解應(yīng)是每一個(gè)開(kāi)發(fā)人員和高級(jí)使用者所必備的。

注意:你將閱讀到的東西并不是那么“優(yōu)雅”。事實(shí)上,盡管在用戶(hù)角度看非常實(shí)用,TTY子系統(tǒng)是由很多繁雜的東西和特殊情況組成的。為了理解它們的由來(lái),我們必須回到過(guò)去:

歷史

在1869年,證券報(bào)價(jià)機(jī)(stock ticker)被發(fā)明了。這是一臺(tái)由打字機(jī),一對(duì)長(zhǎng)電纜和一個(gè)自動(dòng)收錄機(jī)打印機(jī)組成的電動(dòng)機(jī)械機(jī)器,其目的是長(zhǎng)距離實(shí)時(shí)傳播股票的價(jià)格。這個(gè)概念逐漸演變成更快的基于ASCII的電傳機(jī)(teletype)。Teletypes曾經(jīng)在世界各地的大型網(wǎng)絡(luò)中連接,并被稱(chēng)為T(mén)elex,其主要用于傳輸商業(yè)電報(bào),但此時(shí)尚未連接到任何計(jì)算機(jī)。

與此同時(shí),計(jì)算機(jī)(雖然還是又笨重又昂貴)也開(kāi)始支持多任務(wù)處理了,即能夠?qū)崟r(shí)和多個(gè)用戶(hù)進(jìn)行交互。當(dāng)命令行最終取代了古老的批處理模型后,teletypes被用作輸入和輸出設(shè)備,因?yàn)樗鼈冊(cè)谑袌?chǎng)上很容易買(mǎi)到。

但是在市場(chǎng)上有許多種電傳機(jī),它們的模型都略有不同,因此需要計(jì)算機(jī)在軟件層形成兼容。在UNIX世界中,使用的方法是讓操作系統(tǒng)內(nèi)核處理所有底層細(xì)節(jié),例如字長(zhǎng),波特率,流量控制,奇偶校驗(yàn),用于基本行編輯(rudimentary line)的控制代碼等等。而視頻終端(例如20世紀(jì)70年代后期出現(xiàn)的VT-100等)的光標(biāo)移動(dòng),彩色輸出和其他高級(jí)功能則留給了應(yīng)用層。

現(xiàn)在,物理電傳機(jī)和視頻終端實(shí)際上已經(jīng)滅絕了。除非你在訪問(wèn)博物館或者你是一個(gè)硬件愛(ài)好者,否則你看到的所有TTY都是模擬視頻終端,即軟件仿真出來(lái)的終端。但我們即將看到,這些遠(yuǎn)古的知識(shí)依然潛藏在現(xiàn)代TTY設(shè)計(jì)之中。

用例

如下圖所示,用戶(hù)在終端(terminal)打字(物理電傳機(jī)),該終端通過(guò)一對(duì)電纜連接到計(jì)算機(jī)上的UART(通用異步接收器和發(fā)送器)。操作系統(tǒng)中有一個(gè)UART驅(qū)動(dòng)程序,用于管理字節(jié)的物理傳輸,包括奇偶校驗(yàn)和流量控制。在一個(gè)原始的系統(tǒng)中,UART驅(qū)動(dòng)程序會(huì)將傳入的字節(jié)直接傳送給某個(gè)應(yīng)用程序進(jìn)程,但是這種方法將缺乏以下基本特征:

行編輯。大多數(shù)用戶(hù)都會(huì)在輸入時(shí)犯錯(cuò),所以退格鍵會(huì)很有用。這當(dāng)然可以由應(yīng)用程序本身來(lái)實(shí)現(xiàn),但是根據(jù)UNIX設(shè)計(jì)“哲學(xué)”,應(yīng)用程序應(yīng)盡可能保持簡(jiǎn)單。為了方便起見(jiàn),操作系統(tǒng)提供了一個(gè)編輯緩沖區(qū)和一些基本的編輯命令(退格,清除單個(gè)單詞,清除行,重新打印),這些命令在行規(guī)范(line discipline)內(nèi)默認(rèn)啟用。高級(jí)應(yīng)用程序可以通過(guò)將行規(guī)范設(shè)置為原始模式(raw?mode)而不是默認(rèn)的成熟或準(zhǔn)則模式(cooked?and?canonical)來(lái)禁用這些功能。大多數(shù)交互程序(編輯器,郵件客戶(hù)端,shell,及所有依賴(lài)curses或readline的程序)均以原始模式運(yùn)行,并自行處理所有的行編輯命令。行規(guī)范還包含字符回顯和回車(chē)換行(譯者注:\r\n?和?\n)間自動(dòng)轉(zhuǎn)換的選項(xiàng)。如果你喜歡,可以把它看作是一個(gè)原始的內(nèi)核級(jí)sed(1)。

另外,內(nèi)核提供了幾種不同的行規(guī)范。一次只能將其中一個(gè)連接到給定的串行設(shè)備。行規(guī)范的默認(rèn)規(guī)則稱(chēng)為N_TTY(drivers/char/n_tty.c,如果你想繼續(xù)探索的話)。其他的規(guī)則被用于其他目的,例如管理數(shù)據(jù)包交換(ppp,IrDA,串行鼠標(biāo)),但這不在本文的討論范圍之內(nèi)。

會(huì)話(Session)管理。用戶(hù)可能想要同時(shí)運(yùn)行多個(gè)程序,并且一次只與其中一個(gè)交互。如果一個(gè)程序進(jìn)入無(wú)限循環(huán),用戶(hù)可能想要終止或掛起它。在后臺(tái)啟動(dòng)的程序應(yīng)該能夠獨(dú)立運(yùn)行,直到它們嘗試向終端寫(xiě)入(被掛起)。同樣,用戶(hù)的輸入應(yīng)該指向前臺(tái)程序。對(duì)于這些功能,操作系統(tǒng)是在TTY驅(qū)動(dòng)程序(?TTY driver?drivers/char/tty_io.c)中實(shí)現(xiàn)的。

在操作系統(tǒng)中,如果已經(jīng)進(jìn)程有執(zhí)行上下文,我們就說(shuō)它是“活著的”(有一個(gè)執(zhí)行上下文),這也意味著它可以獨(dú)立執(zhí)行操作。而TTY驅(qū)動(dòng)程序不是“活”的; 在面向?qū)ο蟮男g(shù)語(yǔ)中,TTY驅(qū)動(dòng)程序是被動(dòng)對(duì)象(passive object)。它有一些數(shù)據(jù)字段和一些方法,但讓它做某事的唯一方法是當(dāng)它的某個(gè)方法從別的進(jìn)程的上下文或內(nèi)核中斷處理程序中調(diào)用時(shí)。行規(guī)范(line discipline)同樣是一個(gè)被動(dòng)對(duì)象。

現(xiàn)在把它們放在一起看,UART驅(qū)動(dòng),行規(guī)范和TTY驅(qū)動(dòng)這個(gè)三元組就可以被稱(chēng)為T(mén)TY設(shè)備,即我們常說(shuō)的TTY。用戶(hù)進(jìn)程可以通過(guò)在/dev下操作相應(yīng)的設(shè)備文件來(lái)影響任何TTY設(shè)備的行為。由于對(duì)設(shè)備文件寫(xiě)入權(quán)限是必需的,因此當(dāng)用戶(hù)登錄特定的TTY時(shí),該用戶(hù)必須成為設(shè)備文件的所有者——這通常由login(1)程序完成,該程序以root權(quán)限運(yùn)行。

上圖中的物理電線也可以是長(zhǎng)途電話線路(Modem),除了系統(tǒng)必須處理調(diào)制解調(diào)器掛斷的情況,這并沒(méi)有帶來(lái)其他的改變:

讓我們繼續(xù)討論典型的桌面系統(tǒng)。下圖是Linux控制臺(tái)的工作原理:

在上圖中,TTY驅(qū)動(dòng)和行規(guī)范的行為與前面的示例類(lèi)似,但不再有UART或物理終端。相反,軟件仿真出視頻終端(字符和圖形字符屬性幀緩沖器的復(fù)雜狀態(tài)機(jī)),并最終被渲染到VGA顯示器。

如果我們?cè)谟脩?hù)空間也進(jìn)行終端仿真,情況會(huì)變得更加靈活(和抽象)。下圖是xterm(1)及其克隆的工作方式:

為了便于將終端仿真移入用戶(hù)空間,同時(shí)仍保持TTY子系統(tǒng)(會(huì)話管理和行規(guī)范)的完整,偽終端被發(fā)明了出來(lái)(pseudo terminal?或?pty?)。你可能已經(jīng)猜到,當(dāng)你開(kāi)始在偽終端中運(yùn)行偽終端時(shí),事情變得更加復(fù)雜,例如?screen(1)?或?ssh(1)。

現(xiàn)在讓我們退一步看看所有這些東西是如何和進(jìn)程聯(lián)系起來(lái)的。

進(jìn)程

Linux進(jìn)程可以處于下面狀態(tài)之一:

標(biāo)志位說(shuō)明
D不可中斷睡眠(等待某個(gè)事件)
S可中斷睡眠(等待一些事件或者信號(hào))
T停止(收到了工作管理信號(hào)或者進(jìn)程正在被調(diào)試器追蹤)
Z僵尸進(jìn)程(被它的父進(jìn)程終止但是沒(méi)有被回收的進(jìn)程)
R運(yùn)行或者可運(yùn)行(在運(yùn)行隊(duì)列中)

通過(guò)運(yùn)行?ps l, 你可以看到哪個(gè)進(jìn)程正在運(yùn)行,以及哪個(gè)進(jìn)程正在睡眠。如果一個(gè)進(jìn)程處于睡眠狀態(tài),?WCHAN?列("wait channel", 等待隊(duì)列的名字)將會(huì)告訴你這個(gè)進(jìn)程正在等待哪個(gè)內(nèi)核事件。

$ ps l F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND 0 500 5942 5928 15 0 12916 1460 wait Ss pts/14 0:00 -/bin/bash 0 500 12235 5942 15 0 21004 3572 wait S+ pts/14 0:01 vim index.php 0 500 12580 12235 15 0 8080 1440 wait S+ pts/14 0:00 /bin/bash -c (ps l) >/tmp/v727757/1 2>&1 0 500 12581 12580 15 0 4412 824 - R+ pts/14 0:00 ps l

"wait"等待隊(duì)列對(duì)應(yīng)于系統(tǒng)調(diào)用?wait(2)?,因此這個(gè)隊(duì)列中的進(jìn)程的子進(jìn)程不論什么時(shí)候改變了狀態(tài),它們都會(huì)被移入運(yùn)行狀態(tài)。有兩種睡眠狀態(tài):可中斷睡眠和不可中斷睡眠。可中斷睡眠(最常見(jiàn)的情況)意味著當(dāng)進(jìn)程在等待隊(duì)列中時(shí),它實(shí)際上也可能由于收到了一個(gè)信號(hào)而被移入運(yùn)行狀態(tài)。如果你深入到內(nèi)核源碼中,你將會(huì)發(fā)現(xiàn)每個(gè)處理等待事件的內(nèi)核源碼都會(huì)檢查在schedule()調(diào)用返回之后是否有待處理的信號(hào),如果有,就從系統(tǒng)調(diào)用wait(2)中返回。

在上面列出的?ps?結(jié)果中,?STAT?列展示了每個(gè)進(jìn)程的當(dāng)前狀態(tài)。這一列中可能會(huì)顯示一個(gè)或多個(gè)屬性或標(biāo)記:

s這個(gè)進(jìn)程是會(huì)話領(lǐng)導(dǎo)
+這個(gè)進(jìn)程是前臺(tái)進(jìn)程組的一員

這些屬性被用于工作管理。

譯者注:我之前翻譯過(guò)兩篇有關(guān)于進(jìn)程標(biāo)志的文章,可參考

Linux 進(jìn)程狀態(tài)標(biāo)識(shí) Process State Definition

Linux 可運(yùn)行進(jìn)程 Runnable Process Definition

工作與會(huì)話管理

當(dāng)你按下?^Z?掛起程序或者使用?&?在后臺(tái)運(yùn)行程序時(shí),工作管理就發(fā)生了。一個(gè)工作(job)等同于一個(gè)進(jìn)程組。shell內(nèi)置的命令如?jobs,?fg?和?bg?可以用來(lái)管理一個(gè)會(huì)話(session)中的所有工作。每一個(gè)會(huì)話是由一個(gè)會(huì)話領(lǐng)導(dǎo)(session leader),即shell來(lái)管理的,它會(huì)利用復(fù)雜的協(xié)議,例如信號(hào)和一些系統(tǒng)調(diào)用和內(nèi)核打交道。

下面的例子解釋了進(jìn)程、工作、會(huì)話之間的關(guān)系。

下面的shell交互...

...對(duì)應(yīng)這些進(jìn)程...

...和這些內(nèi)核數(shù)據(jù)結(jié)構(gòu)

  • TTY 驅(qū)動(dòng) (/dev/pts/0).
Size: 45x13Controlling process group: (101)Foreground process group: (103)UART configuration (忽略d, since this is an xterm):Baud rate, parity, word length and much more.Line discipline configuration:cooked/raw mode, linefeed correction,meaning of interrupt characters etc.Line discipline state:edit buffer (currently empty),cursor position within buffer etc.
  • pipe0
Readable end (connected to PID 104 as file descriptor 0)Writable end (connected to PID 103 as file descriptor 1)Buffer

其中基本的思想是每個(gè)管道都是一項(xiàng)工作,因?yàn)楣艿乐械拿總€(gè)進(jìn)程都應(yīng)該被同時(shí)進(jìn)行操作(停止,恢復(fù),終止)。這也是為什么?kill(2)?允許你發(fā)送信號(hào)到整個(gè)進(jìn)程組。默認(rèn)情況下,?fork(2)?將新創(chuàng)建的子進(jìn)程放置在與其父進(jìn)程相同的進(jìn)程組中,例如,鍵盤(pán)上的?^C?會(huì)影響父進(jìn)程和子進(jìn)程。但是,作為會(huì)話領(lǐng)導(dǎo)責(zé)任的一部分,每次啟動(dòng)管道時(shí),shell都會(huì)創(chuàng)建一個(gè)新的進(jìn)程組。

TTY驅(qū)動(dòng)程序會(huì)記錄前臺(tái)進(jìn)程組ID(PID),但這只能以被動(dòng)方式進(jìn)行。會(huì)話領(lǐng)導(dǎo)必須在必要時(shí)主動(dòng)更新此信息。同樣,TTY驅(qū)動(dòng)程序會(huì)記錄連接終端的屬性(例如窗口大小),但這些信息必須由終端仿真程序甚至用戶(hù)主動(dòng)更新。

正如在上圖中所看到的,幾個(gè)進(jìn)程將?/dev/pts/0?作為它們的標(biāo)準(zhǔn)輸入。但只有前臺(tái)工作?ls | sort?才會(huì)接收來(lái)自TTY的輸入。同樣,只有前臺(tái)工作才被允許寫(xiě)入TTY設(shè)備(默認(rèn)配置下)。如果cat進(jìn)程試圖寫(xiě)入TTY,內(nèi)核將使用信號(hào)將它掛起。

信號(hào)控制

現(xiàn)在讓我們更近距離地看看內(nèi)核中的TTY驅(qū)動(dòng)、行規(guī)范和UART驅(qū)動(dòng)是如何和用戶(hù)態(tài)進(jìn)程交互的。

UNIX文件,包括TTY設(shè)備文件,可以被讀和寫(xiě),并且由于許多TTY相關(guān)的操作都已經(jīng)被定義,可以使用神奇的?ioctl(2)系統(tǒng)調(diào)用(UNIX的“瑞士軍刀”)進(jìn)行進(jìn)一步操作。但是,ioctl請(qǐng)求必須在進(jìn)程內(nèi)被初始化,因此它們不能在內(nèi)核需要和應(yīng)用進(jìn)行異步通信的場(chǎng)景下被使用。

在The Hitchhiker's Guide to the Galaxy(銀河系漫游指南)中,Douglas Adams提到了一個(gè)“死星”,上面居住這一群消沉的人類(lèi)和某種長(zhǎng)著尖牙的動(dòng)物。這些動(dòng)物通過(guò)狠狠地咬人類(lèi)的大腿來(lái)和人類(lèi)交流(譯者:喵喵喵?)。這和UNIX驚人地相似:在UNIX中,內(nèi)核通過(guò)發(fā)送“癱瘓或者致命”的信號(hào)給用戶(hù)進(jìn)程來(lái)和進(jìn)程通信。一些進(jìn)程可能能夠攔截一些信號(hào),并且嘗試調(diào)整適應(yīng)當(dāng)前的情況,但是大多數(shù)進(jìn)程不會(huì)這么做。

因此信號(hào)是一個(gè)“粗暴”的機(jī)制,它允許內(nèi)核和進(jìn)程進(jìn)行異步通信。UNIX中的信號(hào)定義是不規(guī)整或者不統(tǒng)一的;相反,每個(gè)信號(hào)都是獨(dú)特的,我們必須單獨(dú)研究它們。

你可以使用命令?kill -l?來(lái)看看你的系統(tǒng)實(shí)現(xiàn)了哪些命令。結(jié)果看起來(lái)像下面這樣:

$ kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX

正如你看到的,信號(hào)被從1開(kāi)始的數(shù)字編號(hào)。然而當(dāng)它們被在掩碼中(例如在ps -s的輸出里)被使用時(shí),最低有效位對(duì)應(yīng)信號(hào)1。

這篇文章將會(huì)關(guān)注以下信號(hào):?SIGHUP,?SIGINT,?SIGQUIT,?SIGPIPE,?SIGCHLD,SIGSTOP,?SIGCONT,?SIGTSTP,?SIGTTIN,?SIGTTOU?以及SIGWINCH.

SIGHUP

  • 默認(rèn)操作:?終止
  • 可能的操作: 終止, 忽略, 函數(shù)調(diào)用

當(dāng)檢測(cè)到掛斷(hangup)條件時(shí),UART驅(qū)動(dòng)會(huì)將SIGHUP?發(fā)送到整個(gè)會(huì)話。通常情況下,這會(huì)殺死所有進(jìn)程。某些程序(如?nohup(1)?和?screen(1))會(huì)從其會(huì)話(和TTY)中分離,以便其子進(jìn)程不會(huì)注意到掛斷。

SIGINT

  • 默認(rèn)操作:?終止
  • 可能的操作: 終止, 忽略, 函數(shù)調(diào)用

如果輸入流中出現(xiàn)交互式注意(?interactive attention?)字符(通常為?^C,其代碼為ASCII碼3),那么SIGINT?就會(huì)由TTY驅(qū)動(dòng)發(fā)送到當(dāng)前的前臺(tái)工作,除非此配置已被關(guān)閉。任何有權(quán)訪問(wèn)TTY設(shè)備的人都可以更改交互式注意字符并開(kāi)關(guān)此配置; 此外,會(huì)話管理器會(huì)跟蹤每個(gè)工作的TTY配置,并在有工作切換時(shí)更新TTY。

SIGQUIT

  • 默認(rèn)操作:?內(nèi)核轉(zhuǎn)儲(chǔ)(core dump)
  • 可能的操作: 內(nèi)核轉(zhuǎn)儲(chǔ), 忽略, 函數(shù)調(diào)用

SIGQUIT?的工作方式和?SIGINT相似, 但是使用的字符是?^\?并且默認(rèn)操作不同。

SIGPIPE

  • 默認(rèn)操作:?終止
  • 可能的操作: 終止, 忽略, 函數(shù)調(diào)用

內(nèi)核會(huì)給每一個(gè)試圖往沒(méi)有讀取者的管道中寫(xiě)數(shù)據(jù)的進(jìn)程發(fā)送?SIGPIPE?信號(hào)。 這是很有用的,因?yàn)闆](méi)有這個(gè)信號(hào)的話,類(lèi)似?yes | head這樣的工作就永遠(yuǎn)不會(huì)停止了。

SIGCHLD

  • 默認(rèn)操作:?忽略
  • 可能的操作: 忽略, 函數(shù)調(diào)用

當(dāng)進(jìn)程死亡或更改狀態(tài)(停止/繼續(xù))時(shí),內(nèi)核會(huì)向其父進(jìn)程發(fā)送一個(gè)?SIGCHLD?。?SIGCHLD?信號(hào)攜帶著終止進(jìn)程的附加信息,即進(jìn)程標(biāo)識(shí),用戶(hù)標(biāo)識(shí),退出狀態(tài)(或終止信號(hào))以及一些執(zhí)行時(shí)間的統(tǒng)計(jì)信息。會(huì)話領(lǐng)導(dǎo)(shell)使用這個(gè)信號(hào)追蹤其工作。

SIGSTOP

  • 默認(rèn)操作:?掛起
  • 可能的操作: 掛起

該信號(hào)將無(wú)條件地掛起接收者,即其信號(hào)動(dòng)作不能被重新配置。要注意的是,在工作控制期間,SIGSTOP不會(huì)由內(nèi)核發(fā)送。相反,^Z?通常會(huì)觸發(fā)一個(gè)?SIGTSTP,它可以被應(yīng)用程序攔截。然后應(yīng)用程序可以進(jìn)行例如將光標(biāo)移動(dòng)到屏幕底部等操作,然后使用SIGSTOP將自己置于睡眠狀態(tài)。

SIGCONT

  • 默認(rèn)操作:?喚醒
  • 可能的操作: 喚醒, 喚醒 + 函數(shù)調(diào)用

SIGCONT?將“反掛起”(un-suspend,continue)一個(gè)停止的進(jìn)程。當(dāng)用戶(hù)調(diào)用fg命令時(shí),它會(huì)由shell發(fā)送出去。由于?SIGSTOP?不能被應(yīng)用程序攔截,因此意料之外的SIGCONT?信號(hào)可能表明該進(jìn)程在某段時(shí)間之前被掛起,然后被喚醒。

SIGTSTP

  • 默認(rèn)操作:?掛起
  • 可能的操作: 掛起, 忽略, 函數(shù)調(diào)用

SIGTSTP?與?SIGINT?和?SIGQUIT?的工作原理相似,但是它使用的是?^Z?字符,并且默認(rèn)的操作是掛起進(jìn)程。

SIGTTIN

  • 默認(rèn)操作:?掛起
  • 可能的操作: 掛起, 忽略, 函數(shù)調(diào)用

如果一個(gè)后臺(tái)工作中的進(jìn)程嘗試從TTY設(shè)備中進(jìn)行讀取,TTY會(huì)向整個(gè)工作(組)發(fā)送一個(gè)?SIGTTIN信號(hào),這通常會(huì)掛起這個(gè)工作。

SIGTTOU

  • 默認(rèn)操作:?掛起
  • 可能的操作: 掛起, 忽略, 函數(shù)調(diào)用

如果一個(gè)后臺(tái)工作中的進(jìn)程嘗試向TTY設(shè)備中進(jìn)行寫(xiě)入,TTY會(huì)向整個(gè)工作(組)發(fā)送一個(gè)?SIGTTIN信號(hào),這通常會(huì)掛起這個(gè)工作。這種行為可以通過(guò)配置TTY關(guān)閉。

SIGWINCH

  • 默認(rèn)操作:?忽略
  • 可能的操作: 忽略, 函數(shù)調(diào)用

如前所述,TTY設(shè)備會(huì)記錄終端的窗口大小,但這些信息需要手動(dòng)更新。只要發(fā)生這種更新,TTY設(shè)備就會(huì)向前臺(tái)工作發(fā)送?SIGWINCH?。行為良好的交互式應(yīng)用程序(例如編輯器)會(huì)對(duì)此作出反應(yīng),從TTY設(shè)備獲取新的終端窗口大小并重繪GUI。

譯者注:我之前翻譯過(guò)一篇有關(guān)于進(jìn)程和信號(hào)的文章,可參考

Linux 進(jìn)程與信號(hào)的概念和操作

一個(gè)例子

假設(shè)你正在編輯(基于終端的)編輯器中的文件。此時(shí)光標(biāo)位于屏幕中間的某個(gè)位置,編輯器正在執(zhí)行一些任務(wù),例如對(duì)大文件執(zhí)行搜索和替換操作。現(xiàn)在你按?^Z,由于行規(guī)范已被配置為攔截此字符(^Z?是一個(gè)單字節(jié),ASCII碼為26),因此你無(wú)需等待編輯器完成其任務(wù)然后從TTY設(shè)備開(kāi)始讀取。相反,行規(guī)范子系統(tǒng)會(huì)立即將?SIGTSTP?發(fā)送到前臺(tái)進(jìn)程組。該進(jìn)程組包含編輯器以及由其創(chuàng)建的任何子進(jìn)程。

編輯器為?SIGTSTP?安裝(install)了一個(gè)信號(hào)處理程序,因此內(nèi)核將程序執(zhí)行流轉(zhuǎn)移到信號(hào)處理程序代碼中。通過(guò)將相應(yīng)的控制序列寫(xiě)入TTY設(shè)備,該代碼將光標(biāo)移動(dòng)到屏幕的最后一行。由于編輯器仍處于前臺(tái),控制序列按要求發(fā)送。隨后編輯器會(huì)將?SIGSTOP?發(fā)送到其自己的進(jìn)程組(正如上節(jié)信號(hào)中說(shuō)的那樣)。

編輯器現(xiàn)在已經(jīng)停止,SIGCHLD?信號(hào)向會(huì)話領(lǐng)導(dǎo)通告這個(gè)事件,其中包括該進(jìn)程的ID。當(dāng)前臺(tái)工作中的所有進(jìn)程都被掛起時(shí),會(huì)話領(lǐng)導(dǎo)從TTY設(shè)備讀取當(dāng)前配置,并將其存儲(chǔ)起來(lái)以供以后使用。會(huì)話領(lǐng)導(dǎo)繼續(xù)使用?ioctl?調(diào)用將其自身安裝為T(mén)TY的當(dāng)前前臺(tái)進(jìn)程組。然后,它會(huì)打印類(lèi)似 "[1]+ Stopped" 的內(nèi)容,以通知用戶(hù)工作已暫停。

此時(shí),?ps(1)?會(huì)告訴你編輯器進(jìn)程處于停止?fàn)顟B(tài)(“T”)。如果我們?cè)噲D使用內(nèi)置shell命令bg或使用?kill(1)?向進(jìn)程發(fā)送?SIGCONT來(lái)喚醒它,編輯器將開(kāi)始執(zhí)行其?SIGCONT信號(hào)處理程序。而該處理程序會(huì)嘗試通過(guò)寫(xiě)入TTY設(shè)備來(lái)重新繪制編輯器的GUI界面。但現(xiàn)在編輯器是一個(gè)后臺(tái)工作,TTY設(shè)備將不允許它進(jìn)行寫(xiě)入。所以,TTY會(huì)給編輯器發(fā)送?SIGTTOU?信號(hào),令其再次停止。這個(gè)事件將通過(guò)使用?SIGCHLD傳遞給會(huì)話領(lǐng)導(dǎo)(shell),而shell會(huì)再次向終端寫(xiě)入“[1] + Stopped”。

但是,當(dāng)我們鍵入fg時(shí),shell首先恢復(fù)先前保存的行規(guī)范配置。它通知TTY驅(qū)動(dòng)編輯器工作應(yīng)該從現(xiàn)在起作為前臺(tái)工作。最后,它向進(jìn)程組發(fā)送一個(gè)SIGCONT?信號(hào)。編輯器試圖重繪它的GUI,這次它不會(huì)被SIGTTOU?中斷,因?yàn)樗F(xiàn)在是前臺(tái)工作的一部分。

譯者注:

流控制與I/O阻塞

在?xterm中運(yùn)行?yes?,你會(huì)看到很多“y”出現(xiàn)在你眼前。自然,yes進(jìn)程能夠很快的產(chǎn)生y,以至于xterm來(lái)不及進(jìn)行幀緩沖區(qū)更新,與X服務(wù)器通信(譯者注:X Window System)以便滾動(dòng)窗口等操作。那么這些程序是如何進(jìn)行配合的呢?

答案在于I/O阻塞。偽終端只能在其內(nèi)核緩沖區(qū)內(nèi)保存一定數(shù)量的數(shù)據(jù),當(dāng)該緩沖區(qū)滿(mǎn)并且?yes?嘗試調(diào)用?write(2)時(shí),write(2)將被阻止,并將yes?進(jìn)程移至可中斷的睡眠狀態(tài),直到xterm能夠讀取緩沖中的字節(jié)。

如果TTY連接到串行端口,也會(huì)發(fā)生同樣的情況。假設(shè)?yes?能夠以比9600波特的速率傳輸數(shù)據(jù),但是如果串行端口被限制在低的多速度上,內(nèi)核緩沖區(qū)很快就會(huì)被填滿(mǎn),并且任何后續(xù)的?write(2)?調(diào)用都會(huì)導(dǎo)致進(jìn)程睡眠(或收到返回的錯(cuò)誤號(hào)?EAGAIN?,如果進(jìn)程要求非阻塞I/O的話)。

如果我告訴過(guò)你,即使內(nèi)核緩沖區(qū)中還有剩余空間,也可以主動(dòng)地將TTY置于阻塞狀態(tài),更進(jìn)一步的說(shuō),每個(gè)試圖?write(2)?到TTY的進(jìn)程都會(huì)自動(dòng)阻塞。那么這種功能的用途是什么?

假設(shè)我們正在以9600波特率的速度與一些舊的VT-100通信。我們剛剛發(fā)送了一個(gè)復(fù)雜的控制序列,要求終端滾動(dòng)顯示。此時(shí),終端會(huì)因執(zhí)行滾動(dòng)操作無(wú)法以9600波特的全速率接收新數(shù)據(jù)。實(shí)際上,UART仍然以9600波特運(yùn)行,但終端中沒(méi)有足夠的緩沖空間來(lái)保持接收字符。現(xiàn)在就是將TTY置于阻塞狀態(tài)的好時(shí)機(jī)。但是,我們?cè)撊绾螐慕K端做到這一點(diǎn)?

我們已經(jīng)看到,TTY設(shè)備可以被配置為給某些數(shù)據(jù)字節(jié)特殊的處理。例如,在默認(rèn)配置中,收到的?^C?字節(jié)不會(huì)通過(guò)read(2)傳遞給應(yīng)用程序,而是會(huì)將?SIGINT?信號(hào)傳遞到前臺(tái)工作。類(lèi)似地,可以將TTY配置為對(duì)停止流和開(kāi)始流做出反應(yīng),通常分別是?^S?(ASCII碼19)和?^Q?(ASCII碼17)。舊的硬件終端會(huì)自動(dòng)傳輸這些字節(jié),并期望操作系統(tǒng)相應(yīng)地調(diào)節(jié)其數(shù)據(jù)流。這被稱(chēng)為流控制,這就是為什么當(dāng)你偶然按下?^S?時(shí),你的xterm?會(huì)“鎖定”。

這里有一個(gè)重要的區(qū)別:寫(xiě)入由于流控制而停止的TTY,或者由于缺少內(nèi)核緩沖區(qū)空間,只會(huì)阻塞你的進(jìn)程,而從后臺(tái)工作中寫(xiě)入TTY將導(dǎo)致SIGTTOU?暫停整個(gè)進(jìn)程組。我不知道為什么UNIX的設(shè)計(jì)師必須發(fā)明?SIGTTOU?和?SIGTTIN?,而不是僅僅依靠I/O阻塞,但我最好的猜測(cè)是負(fù)責(zé)工作控制的TTY驅(qū)動(dòng)是為了監(jiān)視和操縱整個(gè)工作——而不是其中的單個(gè)進(jìn)程。

配置TTY設(shè)備

為了找出你的shell調(diào)用的控制TTY,你可以使用前面說(shuō)過(guò)的ps l,或者運(yùn)行tty(1)命令。

進(jìn)程可以使用?ioctl(2)讀取或修改打開(kāi)的TTY設(shè)備的配置。 該API在?tty_ioctl(4)中有描述。 由于它是Linux應(yīng)用程序和內(nèi)核之間的二進(jìn)制接口的一部分,它將在Linux版本迭代中得到保持。 但是,該接口是不可移植的,應(yīng)用程序應(yīng)該使用?termios(3)?手冊(cè)頁(yè)中描述的POSIX包裝器。

我不會(huì)詳細(xì)討論?termios(3)?接口的細(xì)節(jié),但是如果你正在編寫(xiě)C程序并希望在?^C?變成?SIGINT之前攔截?^C?,或者禁用行規(guī)范或字符回顯,或?qū)⒏囊粋€(gè)串的口波特率,關(guān)閉流控制等,你就會(huì)發(fā)現(xiàn)你需要上述的手冊(cè)頁(yè)(man page)。

這里還有一個(gè)名為?stty(1)的命令行工具來(lái)操作TTY設(shè)備。 它使用的是?termios(3)?API。

讓我們?cè)囋嚢?#xff01;

$ stty -aspeed 38400 baud; rows 73; columns 238; line = 0;intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts-ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany imaxbel -iutf8opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

-a?參數(shù)是讓stty顯示所有的設(shè)置。默認(rèn)情況下,它將查看連接到shell的TTY設(shè)備,但可以通過(guò)-F指定其他的設(shè)備。

在上面顯示出的設(shè)置中,一些會(huì)改變UART參數(shù),一些會(huì)影響行規(guī)范,一些則用于工作控制。我們先來(lái)看看第一行:

屬性設(shè)備說(shuō)明
rows, columnsTTY驅(qū)動(dòng)該TTY設(shè)備的終端的大小(以字符作為基準(zhǔn))。基本上,它只是內(nèi)核空間中的一對(duì)變量,你可以自由設(shè)置和獲取。設(shè)置它們將導(dǎo)致TTY驅(qū)動(dòng)程序向前臺(tái)工作發(fā)送SIGWINCH。
line行規(guī)范該TTY設(shè)備的行規(guī)范. 0 代表?N_TTY. 所有可用的數(shù)值在?/proc/tty/ldiscs中有列出. 使用未列出的數(shù)值等價(jià)于使用?N_TTY, 但是不要依賴(lài)于這一點(diǎn).
speedUART波特率。偽終端忽略這個(gè)參數(shù)。

嘗試以下操作:啟動(dòng)一個(gè)?xterm。記下它的TTY設(shè)備(?tty命令獲得)及其窗口大小(由stty -a獲得)。接著在xterm中啟動(dòng)?vim?(或其他一些全屏終端應(yīng)用程序)。vim編輯器會(huì)向TTY設(shè)備查詢(xún)當(dāng)前的終端窗口大小,以此填充整個(gè)窗口。現(xiàn)在,從另一個(gè)shell窗口輸入:

stty -F X rows Y

其中X是剛才獲得的TTY設(shè)備,Y是終端高度的一半。這將更新內(nèi)核內(nèi)存中的TTY數(shù)據(jù)結(jié)構(gòu),并向編輯器發(fā)送?SIGWINCH?,vim將使用可用窗口區(qū)域的上半部分重繪GUI。

stty -a?輸出的第二行列出了所有特殊的字符,開(kāi)一個(gè)新的?xterm?然后試試這個(gè):

stty intr o

現(xiàn)在,"o"而不是?^C將向前臺(tái)工作發(fā)送?SIGINT?。嘗試運(yùn)行一些程序,比如?cat,并看看你能不能用?^C殺死它。然后,嘗試在其中輸入“hello”。

有時(shí)候,你可能會(huì)遇到退格鍵不起作用的Unix系統(tǒng)——當(dāng)終端仿真器發(fā)送與TTY設(shè)備中的擦除設(shè)置不匹配的退格碼(ASCII 8或ASCII 127)時(shí),就會(huì)發(fā)生這種情況。為了解決這個(gè)問(wèn)題,請(qǐng)?jiān)O(shè)置?stty erase ^H?(ASCII 8)或?stty erase ^??(ASCII 127)。要注意的是,許多終端應(yīng)用程序使用readline,這使得行規(guī)范處于原始模式,即這些應(yīng)用程序不受到影響。

最后,stty -a列出了一系列開(kāi)關(guān)(沒(méi)有特定順序列出)。其中一些與UART相關(guān),一些影響線路規(guī)范行為,一些用于流量控制,一些用于工作控制。短劃線( - )表示開(kāi)關(guān)關(guān)閉;否則它是開(kāi)著的。所有的開(kāi)關(guān)都在stty(1)手冊(cè)頁(yè)中進(jìn)行了解釋,所以我將簡(jiǎn)單地提一下:

icanon用于將行規(guī)范切換為規(guī)則(基于行)模式。在一個(gè)新的?xterm中試試這個(gè),關(guān)閉這個(gè)模式:

stty -icanon; cat

現(xiàn)在所有的行編輯字符,例如退格或者^(guò)U都會(huì)停止工作。另外注意到cat?會(huì)一次接受一個(gè)字符(并連續(xù)輸出),而不是一次接受一行。

echo?是啟用字符回顯的開(kāi)關(guān)(默認(rèn)也是開(kāi)著的)。現(xiàn)在重新啟動(dòng)規(guī)則模式(stty icanon)然后試試這個(gè):

stty -echo; cat

當(dāng)你輸入時(shí),你的終端仿真器將信息傳送給內(nèi)核,而內(nèi)核通常會(huì)將相同的信息回顯給終端仿真器,以便讓你看到之前鍵入的內(nèi)容。現(xiàn)在沒(méi)有了字符回顯,你就不能看到你輸入的內(nèi)容。不過(guò)我們處于熟化(cooked)模式,所以行編輯工具仍在工作。一旦你按下回車(chē)鍵,行規(guī)范就會(huì)把編輯緩沖區(qū)的數(shù)據(jù)傳送給cat,顯示出你剛剛鍵入的內(nèi)容。

tostop?是控制后臺(tái)進(jìn)程是否允許寫(xiě)入終端的開(kāi)關(guān),先試試這個(gè):

stty tostop; (sleep 5; echo hello, world) &

&?會(huì)使得該命令作為后臺(tái)工作運(yùn)行。五秒鐘后,該工作將嘗試寫(xiě)入TTY。 TTY驅(qū)動(dòng)程序?qū)⑹褂?SIGTTOU將其掛起,并且shell可能會(huì)立即報(bào)告此事件,或者發(fā)出別的提示。現(xiàn)在嘗試下面的代碼:

stty -tostop; (sleep 5; echo hello, world) &

五秒鐘之后,后臺(tái)工作會(huì)在你當(dāng)前的光標(biāo)位置輸出?hello, world?。

最后,?stty sane?會(huì)將你的TTY設(shè)置成一個(gè)相對(duì)合理的配置。

結(jié)語(yǔ)

我希望這篇文章為你提供了足夠的信息去了解TTY驅(qū)動(dòng)和行規(guī)范,以及它們與終端,行編輯和工作控制之間的關(guān)系。 更多細(xì)節(jié)可以在我提到的各種手冊(cè)頁(yè)以及glibc手冊(cè)(info libc,"Job Control")中找到。

最后,盡管我沒(méi)有足夠的時(shí)間來(lái)回答所有問(wèn)題,但我歡迎任何對(duì)本網(wǎng)站上的其他網(wǎng)頁(yè)提出的反饋意見(jiàn)。 謝謝閱讀!

總結(jié)

以上是生活随笔為你收集整理的解密TTY的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

色av男人的天堂免费在线 | 伊人伊成久久人综合网站 | 在线观看mv的中文字幕网站 | 在线观看免费 | 91精品国产91| 国产精品久久久久久久久久尿 | 欧美日韩精品在线播放 | 亚洲一级免费电影 | 最新中文字幕 | 日韩欧美国产免费播放 | 在线视频专区 | 黄色网中文字幕 | 在线观看视频一区二区三区 | 三级黄色免费 | 国产精品一区二区久久精品爱微奶 | 美女很黄免费网站 | 国产亚洲精品久 | 欧美 日韩精品 | 成人免费在线观看av | 久久免费视频网站 | 色婷婷色 | 国产精品综合av一区二区国产馆 | 欧美精品天堂 | 亚洲播放一区 | 在线免费观看视频a | 99精品影视 | 免费视频色 | 欧美一级性生活 | 欧美尹人| 国产精品无 | 国产精品乱码久久久久 | 成人资源在线 | 开心丁香婷婷深爱五月 | 91中文字幕在线播放 | 中文字幕亚洲综合久久五月天色无吗'' | 亚洲精品麻豆 | 男女啪啪免费网站 | 97在线观看免费高清 | 涩涩网站在线观看 | 亚洲天天摸日日摸天天欢 | 西西人体4444www高清视频 | 日韩久久午夜一级啪啪 | 国产精品成人在线观看 | 国偷自产视频一区二区久 | 国产精品大尺度 | 久久免费视频精品 | www99精品| 最新中文字幕在线观看视频 | 激情综合色综合久久 | 97超碰人人模人人人爽人人爱 | 日本中文字幕一二区观 | av中文字幕网 | 亚洲一区天堂 | 久久国产网 | 超碰在线人人 | 欧美日韩高清一区 | 国产精品mm | 精品国产一二三 | 国产色视频网站 | 在线播放 亚洲 | 日韩精品免费在线观看视频 | 国产中文字幕亚洲 | 日韩视频免费观看高清完整版在线 | 久久免费电影 | 天天干夜夜爱 | 在线观看岛国av | 涩涩色亚洲一区 | 一区二区三区四区五区在线视频 | 色就干| 久久99热精品| 激情九九| 成人黄色在线 | 爱情影院aqdy鲁丝片二区 | 久久人人爽人人爽人人 | 久久综合久久综合久久综合 | 深爱激情站 | 亚洲人xxx | 麻豆国产精品永久免费视频 | 中文字幕五区 | 香蕉视频网址 | 日韩视频一区二区三区在线播放免费观看 | 超碰在线成人 | 欧美激情视频免费看 | 国产精品对白一区二区三区 | 国产在线更新 | 天堂在线免费视频 | 成人天堂网 | 国产一级电影在线 | 国产免费视频一区二区裸体 | a黄在线观看| 久久国语 | 欧美日韩三级 | 91黄色小视频 | 婷婷久操| 又黄又爽又刺激视频 | 99精品免费久久久久久日本 | 精品国产1区二区 | 91在线91拍拍在线91 | 中文字幕第一页av | 激情视频网页 | 97视频人人 | 成人 亚洲 欧美 | 国产亚洲资源 | 免费视频久久久久久久 | 超碰国产在线观看 | 免费观看一级一片 | 天天干天天操天天射 | 天天干天天天 | 色www. | 免费观看特级毛片 | 人人躁 | 麻豆系列在线观看 | 亚洲成人精品在线观看 | 激情综合久久 | 久久久久激情视频 | 亚洲国产视频直播 | 国产一区精品在线观看 | 天天插天天射 | 91在线观看黄 | 欧美激情操 | 欧美日韩视频在线观看免费 | 日韩不卡高清视频 | 最新亚洲视频 | 69久久99精品久久久久婷婷 | 成人a级免费视频 | 久草视频观看 | 九九在线高清精品视频 | 色丁香婷婷 | 98福利在线 | 亚洲国产精品日韩 | 五月婷在线视频 | 免费色黄 | 日韩久久精品一区二区三区下载 | 久久成电影 | 97成人超碰 | 天天做天天爱夜夜爽 | 在线观看免费一级片 | 最新成人av | 中文字幕在线播放一区二区 | aa一级片 | 五月天综合激情网 | 国产亚洲精品久久久久秋 | 久久久久影视 | 99久久精品视频免费 | 韩国av免费 | 国产原创av在线 | 九色福利视频 | 日韩精品久久久久 | 美女免费视频观看网站 | 国产欧美在线一区二区三区 | 正在播放亚洲精品 | 麻豆传媒在线免费看 | 色.com| 操一草 | 二区视频在线观看 | 成人一区电影 | 欧美亚洲免费在线一区 | 日韩精品不卡在线观看 | 日韩免费电影网站 | 99国产精品久久久久久久久久 | 在线看国产日韩 | 四虎国产精品成人免费影视 | 综合五月 | 亚洲国产精品电影在线观看 | 日韩成人免费在线观看 | 欧美日韩久久不卡 | 国产精品 日韩 欧美 | 91视频久久久| 在线亚洲人成电影网站色www | 92中文资源在线 | 91高清在线| 久久久av电影 | 婷婷丁香在线 | 18久久久 | 久久兔费看a级 | 激情视频91 | 91香蕉视频 | а中文在线天堂 | 99免费在线播放99久久免费 | avav片| 91在线播| 超碰97在线资源站 | 日韩免费在线 | 激情网站网址 | 欧美成人猛片 | 亚洲欧美日韩精品久久奇米一区 | 久久人人爽爽人人爽人人片av | 中文字幕精品www乱入免费视频 | 丰满少妇在线观看资源站 | 精品久久福利 | 黄色在线观看污 | 成人亚洲免费 | 在线视频日韩精品 | 中文区中文字幕免费看 | 国产精品久久久久久久电影 | 国产亚洲精品v | 综合久久五月天 | 色亚洲网| 欧美a级在线 | 国产精品日韩在线 | 久久伊人操 | 色丁香色婷婷 | 久久精品综合网 | 在线观看免费黄色 | 在线v| 欧美va在线观看 | 日本韩国精品一区二区在线观看 | 亚洲精品免费在线 | 久久婷婷一区二区三区 | 日本久久久久久久久久 | 丁香婷婷久久久综合精品国产 | 麻豆视频在线播放 | 国产亚洲精品中文字幕 | 天天色天天操综合网 | 免费在线激情视频 | 六月丁香综合 | 国产高清一 | 69av国产 | 97成人在线视频 | 精品福利国产 | 中文字幕在线电影 | 福利av影院 | 欧美91片| 四虎天堂 | av成人免费 | 亚洲精品视频一 | 字幕网资源站中文字幕 | 日日干夜夜骑 | 91九色最新地址 | 久久久久这里只有精品 | 欧美粗又大 | 在线 日韩 av | japanesexxxhd奶水| 亚洲成av人影院 | 97av视频 | 日本在线观看一区 | 亚洲人天堂 | 日韩欧美国产视频 | 欧美aa一级片 | 91色偷偷 | 国产精品久久久久婷婷 | 91久久奴性调教 | 国产精品影音先锋 | 成人av电影在线 | 黄色小说网站在线 | 欧美婷婷综合 | 91亚洲永久精品 | 欧美日韩国产精品一区二区 | 国产成人av免费在线观看 | 香蕉网在线观看 | 亚洲少妇xxxx | 天天操夜夜看 | 视频二区在线视频 | 天天草天天草 | 最近日本字幕mv免费观看在线 | 久久免费av | 久久国产美女视频 | 日韩高清不卡在线 | 国内精品久久久久久 | 婷婷六月激情 | 99精品久久99久久久久 | 国产69精品久久99的直播节目 | 男女啪啪网站 | 91久久精品一区二区三区 | 亚洲精品视频在线观看免费 | 99久久婷婷国产 | 日韩视频在线不卡 | 久久影视中文字幕 | 久久人人爽人人片av | 五月婷婷另类国产 | 国产精品96久久久久久吹潮 | 狠狠色综合网站久久久久久久 | 久插视频 | 四虎成人精品永久免费av | 99精品在这里 | 国产免费嫩草影院 | 免费看的黄网站 | 久久免费精彩视频 | 欧美一级小视频 | 高清视频一区 | 亚洲黄色片一级 | 国产免费亚洲 | 在线性视频日韩欧美 | 国产91丝袜在线播放动漫 | 国产小视频免费在线网址 | av福利网址导航大全 | 成人精品电影 | 久久综合影音 | 成人久久18免费网站麻豆 | 久久www免费人成看片高清 | 激情视频二区 | 男女激情片在线观看 | 天天干夜夜爱 | 日日干夜夜爱 | 久久激情精品 | 日韩欧美一区二区三区在线 | 国产精品大片在线观看 | 日操操| 久久伊人国产精品 | 久草在线手机视频 | 日韩免费看的电影 | 免费在线观看av | 在线韩国电影免费观影完整版 | 免费在线色电影 | 黄色av电影免费观看 | 久久久资源 | 色婷婷丁香 | 久久少妇免费视频 | 在线午夜| 在线日韩中文字幕 | 99久久99久久精品免费 | 亚洲精品国产第一综合99久久 | 久久精品欧美一区二区三区麻豆 | 日韩成人欧美 | 在线播放日韩av | 色噜噜在线观看视频 | 国产高清不卡一区二区三区 | 成人毛片a | 99久久精品国产亚洲 | 精品国产一区二区三区男人吃奶 | 毛片1000部免费看 | 黄色精品久久 | 亚洲欧美视屏 | 精品久久片 | 国产精品久久影院 | 日韩欧美在线观看一区 | 五月婷婷免费 | 久九视频 | 视频在线观看亚洲 | 9999亚洲 | 九草视频在线 | 在线va网站| 欧美日韩1区2区 | 亚洲成人频道 | 色小说在线 | 日韩久久久久久久久久 | 久久久电影网站 | 日av免费 | 欧美va日韩va | 日韩免费二区 | 国产精品久久在线观看 | 色综合天天狠天天透天天伊人 | 久草电影在线 | 最近字幕在线观看第一季 | 天天操狠狠操 | 日日夜夜操av | 免费看片成人 | 中文不卡视频 | 国产精品高清一区二区三区 | 国产高清在线免费视频 | 欧美精品免费一区二区 | 91视频免费看 | 黄p在线播放 | 精品免费观看视频 | 中文字幕一区二区三区精华液 | 999国内精品永久免费视频 | 久久涩视频 | 91亚洲网站| 免费黄色激情视频 | 国产伦理久久精品久久久久_ | 国产一区二区高清不卡 | 欧美日韩一区二区在线 | 中文字幕三区 | 婷婷伊人综合 | 久久久久久欧美二区电影网 | 国产精品久久久久一区二区国产 | 少妇bbr搡bbb搡bbb | 91精品无人成人www | 97视频免费观看 | 97电影手机 | 美女国内精品自产拍在线播放 | 91麻豆精品国产91久久久久久久久 | 亚洲蜜桃在线 | 欧美一级片| 欧美va天堂在线电影 | 婷婷国产v亚洲v欧美久久 | 成人欧美亚洲 | 色偷偷88888欧美精品久久久 | 日韩精品视频第一页 | 97av视频在线观看 | 9草在线 | 亚洲毛片一区二区三区 | 欧美少妇xxxxxx | 亚洲精品在线电影 | 国产精品美女网站 | 中文字幕在线一区观看 | 国产精品欧美久久久久天天影视 | 日韩黄色在线观看 | 国产精品久久久久久爽爽爽 | 伊人色综合久久天天网 | 黄网站app在线观看免费视频 | 国产亚洲婷婷免费 | 99热这里只有精品国产首页 | 香蕉在线观看视频 | 日韩高清片 | 少妇bbb搡bbbb搡bbbb′ | 国产精品99久久久久久武松影视 | 久久婷婷五月综合色丁香 | 美女视频国产 | 日狠狠| 91av蜜桃 | 黄色在线观看网站 | 亚洲91精品| 国产免费xvideos视频入口 | 成人午夜在线观看 | 久久国产剧场电影 | 久久久久久久久久久成人 | 亚洲国产片色 | 国产精品一区在线播放 | 黄色一级网 | 狠狠干网站| 在线视频中文字幕一区 | 国产精品嫩草影视久久久 | 国产无套精品久久久久久 | 欧美成人tv | 国产精品99久久久久久人免费 | 精品国产乱码久久久久久浪潮 | 久久久精品国产免费观看一区二区 | 91视频免费看网站 | 色多多污污 | 国产欧美在线一区 | 亚洲免费在线播放视频 | 久久免费视频这里只有精品 | 激情综合五月天 | 久久婷婷一区二区三区 | 成人在线视频论坛 | 亚洲精品国产第一综合99久久 | 五月宗合网 | 欧美 亚洲 另类 激情 另类 | 免费看的国产视频网站 | 麻豆高清免费国产一区 | 波多野结衣视频一区二区 | 狠狠操在线 | 免费视频区 | 免费亚洲视频在线观看 | 三级av在线 | 日韩特级黄色片 | 在线观看va | 国产精品久久久久久久久免费看 | 欧美日韩精品在线观看视频 | 成年人在线免费看 | 成人作爱视频 | 国产精品日韩高清 | 国产精品成 | 国产精品原创在线 | 国产免费av一区二区三区 | 亚洲精品动漫成人3d无尽在线 | 久草在线一免费新视频 | 精品国产一区二区三区久久久久久 | 在线看片成人 | 麻豆国产在线播放 | 成人免费视频在线观看 | 亚洲精品综合在线 | 亚洲天天综合 | 黄色a在线观看 | 97色国产 | 国产一区二区视频在线 | 久久久久久麻豆 | 97热视频 | 亚洲激情综合 | 国产一二区视频 | 插插插色综合 | 又黄又刺激视频 | 精品不卡av| 中文字幕在线免费观看 | 99国产在线 | 成人福利在线观看 | se婷婷| 婷婷性综合 | 午夜精品一二三区 | 福利一区在线 | 久久久国产影院 | 中文字幕一二 | 午夜av一区二区三区 | 国产视频 亚洲精品 | 狠狠色伊人亚洲综合网站色 | 最新一区二区三区 | 91免费视频黄| 日韩免费b| 91传媒在线播放 | 深夜免费小视频 | 久久综合9988久久爱 | 婷婷在线精品视频 | 日本xxxxav| 国产精品中文在线 | 亚洲黄色网络 | 久久久久久高潮国产精品视 | 免费a v网站 | 成人免费视频在线观看 | 久久久久婷 | 天天伊人网 | 欧美另类高潮 | 久久天天综合网 | 九九精品久久 | 丁香狠狠| 久久久久国产成人免费精品免费 | 九九99| 97色免费视频 | 草久在线| 国产午夜精品久久 | 国产一区二区三区黄 | 亚洲精品456在线播放乱码 | 日日爽天天爽 | 午夜精品一区二区三区在线视频 | 成人97视频 | 欧美a在线看 | 国产盗摄精品一区二区 | 一区二区av | av观看久久久 | 婷婷色影院 | 久久激五月天综合精品 | 日韩免费一区二区在线观看 | 久久天天操 | 亚洲午夜精品久久久 | 伊人开心激情 | 久久精品伊人 | 国产成视频在线观看 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 五月天综合激情 | 999ZYZ玖玖资源站永久 | 亚洲精品观看 | 成人久久久精品国产乱码一区二区 | 成人福利在线观看 | 日韩字幕在线观看 | 亚洲三级性片 | 色多视频在线观看 | 久草成人在线 | 国内精品久久久久影院日本资源 | 国产专区视频在线观看 | 最新99热 | 国产精品色婷婷 | 久久久国产精品电影 | 91免费看黄| 99色视频在线 | 久久久久99精品成人片三人毛片 | 成人宗合网 | 中文字幕在线日 | 国产黄色精品视频 | 国产一级二级三级在线观看 | 永久精品视频 | 亚洲 欧美 日韩 综合 | 亚洲最新视频在线 | 国产精品成人免费 | 久久激五月天综合精品 | 色五婷婷 | 色婷婷综合视频在线观看 | 国产一区二三区好的 | 日韩影视在线 | 精品一区二区精品 | 五月天高清欧美mv | 国产福利午夜 | 国产成人精品一区二区三区 | 国产高清一区二区 | 97操碰 | 激情五月婷婷综合网 | 精品视频国产 | 亚洲 欧美 变态 国产 另类 | 91成人免费在线视频 | 香蕉视频在线免费看 | 成人午夜影院在线观看 | 在线看一区二区 | 最近最新中文字幕 | 中文区中文字幕免费看 | 国产一级二级在线 | 日韩在线中文字幕 | 香蕉视频免费看 | 最近中文字幕国语免费av | 人人草在线视频 | 日韩精品一区二区三区视频播放 | 国产一级高清视频 | 日日干网址 | 国产不卡免费视频 | 久久xx视频 | 午夜国产福利在线观看 | 久久九九久久 | 日韩丝袜在线观看 | 欧美一级电影 | 亚洲毛片一区二区三区 | 日韩电影久久 | 成人精品国产免费网站 | 亚洲精品一区中文字幕乱码 | 中日韩欧美精彩视频 | 狠狠色伊人亚洲综合网站色 | 在线观看成人小视频 | www.99久久.com | 国产精品欧美久久久久三级 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 99精品国产aⅴ | 在线黄色观看 | 在线97| 超碰公开97 | 国内成人精品视频 | 欧美一级片免费 | www.黄色网.com | 久久精品国产成人精品 | 99国产精品视频免费观看一公开 | 精品国内自产拍在线观看视频 | 日本中文在线播放 | 久草视频免费在线观看 | bbbb操bbbb| 韩国av永久免费 | 人人讲下载 | 四虎影视精品 | 99精品久久久久 | 亚洲五月六月 | 手机色在线 | 中文字幕在线不卡国产视频 | 免费在线国产 | 91av电影在线观看 | 成人免费网站视频 | 蜜臀久久99精品久久久无需会员 | 九九九九热精品免费视频点播观看 | 国产黄网在线 | 亚洲精品视频播放 | 午夜神马福利 | 中国一级片在线播放 | 欧美日韩在线播放 | 成人丝袜| 一区二区三区观看 | 亚洲国产综合在线 | 久久97久久97精品免视看 | 国产一区二区三区在线 | 国产精品视频999 | 免费在线观看日韩欧美 | 看毛片网站 | 91精品国自产拍天天拍 | 婷婷九月丁香 | 久久久黄色免费网站 | 亚洲精品在线网站 | 欧美成人h版在线观看 | 91精选在线 | 91精品无人成人www | 国产高清一 | 日韩在线观看的 | 五月天av在线 | 狠狠色丁香婷婷综合基地 | 日韩中字在线 | 国产不卡网站 | jizz18欧美18 | 国产精品视频不卡 | 在线 欧美 日韩 | 亚洲精品国内 | 久久久综合精品 | 青青五月天 | www.五月婷婷.com| 日韩欧美国产精品 | 天天操天天曰 | 天天操狠狠干 | 精品久久国产 | 91最新视频在线观看 | 亚洲精品视频播放 | 欧美人牲 | 亚洲乱码在线观看 | www.天天成人国产电影 | 亚洲精品乱码久久久久久高潮 | 日韩综合视频在线观看 | 黄色小说视频网站 | 在线观看www. | 91亚洲精品在线 | 午夜视频在线网站 | 国产精品 日韩 欧美 | 久久一视频 | www.com黄色| 亚洲精品视频在线观看免费视频 | 日本一区二区免费在线观看 | 最近2019好看的中文字幕免费 | 国产又粗又硬又爽的视频 | 91亚洲网站| 黄色大片免费播放 | 香蕉网在线观看 | 亚洲 欧洲av | 国产一级做a| 91电影福利| 99国产精品久久久久老师 | 日韩字幕 | 亚洲精品小区久久久久久 | 国产无遮挡又黄又爽在线观看 | 欧美一级电影片 | 丁香六月久久综合狠狠色 | 天堂va在线观看 | 免费在线观看午夜视频 | 少妇性bbb搡bbb爽爽爽欧美 | 好看的国产精品视频 | 黄色的网站免费看 | 国产高清不卡av | 色婷婷精品大在线视频 | 这里只有精品视频在线观看 | 日韩com | 国产精品久久99综合免费观看尤物 | 人人干免费| 久久免费在线观看视频 | 久久精品视频在线观看免费 | 午夜精品一区二区三区四区 | 日韩经典一区二区三区 | 在线观影网站 | 91av手机在线观看 | 色99视频 | 99re热精品视频 | 日本精品久久久久久 | 日日碰狠狠添天天爽超碰97久久 | 99视频免费观看 | 日韩中文三级 | 91九色视频观看 | 一级黄色片在线观看 | 中文字幕第一页在线视频 | 精品国产电影一区二区 | 国产成人久久av免费高清密臂 | 综合久久精品 | 国内一级片在线观看 | 一本一道久久a久久精品蜜桃 | 免费黄在线观看 | 亚洲国产剧情 | 国产精品国产三级国产aⅴ入口 | 亚洲黄色免费在线 | 天天躁日日躁狠狠躁av麻豆 | 91网免费观看 | 国产精品视频久久 | 久久久久久久国产精品影院 | 久久久精品小视频 | 92中文资源在线 | 久久久久国产一区二区 | 国产精品黄网站在线观看 | 国产精品美女久久久久久久 | 狠狠狠狠狠狠狠 | 99久久爱| 亚洲国产欧美一区二区三区丁香婷 | 国产精品日韩欧美一区二区 | 日本不卡123区 | 一区二区三区在线不卡 | www色综合| 亚洲一区网 | av一级网站 | 精品一区在线 | 欧美一级视频一区 | 久久久久草 | 亚洲激情视频在线 | 色视频在线看 | 天天操天天干天天操天天干 | 91色九色 | 国产午夜在线 | 精壮的侍卫呻吟h | 日韩欧美一区二区三区在线 | 日日干天天插 | 在线视频福利 | 国产尤物在线视频 | 天天色天天综合网 | 国产中文欧美日韩在线 | 久久99精品久久只有精品 | a午夜电影| 国产特级毛片 | 久久免费视频在线观看6 | 91污视频在线观看 | 成人福利av| 久久久片| 婷婷五月情 | 一本到视频在线观看 | 97在线成人 | 欧美国产日韩中文 | 国产黄在线播放 | h视频在线看 | 久草视频在线免费播放 | 亚洲理论在线观看电影 | 国产精品99久久久久久人免费 | 91资源在线播放 | av色图天堂网 | 精品特级毛片 | 在线午夜电影神马影院 | 97在线观看免费观看 | 人人插人人射 | 国产一区二区中文字幕 | 手机在线黄色网址 | www.天天射| 日日狠狠 | 天天操天天干天天操天天干 | 麻豆国产露脸在线观看 | 黄色av网站在线观看免费 | 久久久精品二区 | 日韩亚洲在线视频 | 国产真实精品久久二三区 | 最新日韩视频在线观看 | 欧美日韩亚洲第一 | 国产一级久久久 | 99久久精品日本一区二区免费 | 97成人精品视频在线观看 | 黄色av网站在线观看免费 | 日韩免费电影网站 | 日韩久久在线 | 在线免费性生活片 | 国产精品免费久久久久影院仙踪林 | 久久精品国产久精国产 | 精品国产一区二区久久 | 国产99久久久国产精品免费二区 | 91视频久久久| www亚洲精品 | 日日干 天天干 | 四虎影视成人精品国库在线观看 | 午夜三级大片 | 美女免费视频一区二区 | 午夜久久成人 | 日韩久久精品一区二区 | 成人一区二区在线观看 | 日日干av | 中文在线字幕免费观 | 激情丁香5月 | 高潮久久久 | 婷婷激情小说网 | 国产视频在线一区二区 | 韩国精品在线观看 | 超碰97免费 | 五月天天天操 | 国产精品va在线播放 | 久久久久久久精 | 久久精品视频2 | 91香蕉视频好色先生 | 青草草在线视频 | 国产精品成人一区二区 | 中文字幕一区二区三区在线播放 | 国产在线更新 | 国产精品欧美 | 97人人艹| 天天躁天天躁天天躁婷 | 国产九色视频在线观看 | 在线看小早川怜子av | 色网站在线免费 | 色综合综合 | 国产福利资源 | 欧美精品一区二区免费 | 九色视频网站 | 亚洲精品乱码久久久久久 | 91av在线不卡 | 亚洲人成在线观看 | 天天综合网 天天综合色 | 国产99在线 | 在线播放日韩av | 韩国av电影在线观看 | 伊人超碰在线 | 日韩欧美视频在线观看免费 | 五月综合激情网 | 久久99在线观看 | 波多野结衣电影一区 | 欧美一级性生活片 | 免费av小说| 色欧美日韩| 日韩在线精品 | 中文字幕在线看视频国产中文版 | 亚洲一区精品二人人爽久久 | 99精品免费视频 | 成人免费视频免费观看 | 伊色综合久久之综合久久 | 国产欧美精品在线观看 | 日日爱av | 国产精品99免费看 | 日韩在线色视频 | 日韩精品视频在线免费观看 | 国产精品久久久久一区二区 | 亚洲黄色免费观看 | 精品免费观看视频 | 在线 视频 一区二区 | 最新av在线网站 | 综合色天天 | 欧美大香线蕉线伊人久久 | 婷婷五情天综123 | 欧美一级小视频 | 日本韩国在线不卡 | 久久免费视频2 | 中文字幕久久久精品 | 国产福利一区在线观看 | 精品久久综合 | 久久99国产精品久久99 | 久99久精品视频免费观看 | 日日操操操 | 久黄色 | 二区三区毛片 | 丁香花在线观看免费完整版视频 | 亚洲精品男人的天堂 | 精品国产乱子伦一区二区 | 久久久久观看 | 久久久久久久久免费视频 | 欧美日韩在线精品 | 日韩欧美在线一区二区 | 欧美激情视频一二区 | 韩日电影在线观看 | 91亚洲精品久久久蜜桃网站 | 99精品视频精品精品视频 | 国产色中涩 | 99视频这里有精品 | 在线观看成人福利 | 国产va饥渴难耐女保洁员在线观看 | 欧美日韩后 | 91精品国产网站 | 亚洲免费精彩视频 | 韩国三级在线一区 | 人人讲 | 99理论片 | 亚洲欧美精品在线 | 成人中心免费视频 | www.婷婷色 | 69久久久| 一本一本久久a久久精品综合 | 亚洲永久精品国产 | av资源中文字幕 | 婷婷激情综合网 | 欧美日韩中文字幕在线视频 | 成人教育av | 97精品一区二区三区 | 亚洲国产伊人 | 97超视频在线观看 | 免费在线国产精品 | 狠狠色丁香久久婷婷综合五月 | 色天天综合网 | 欧美va天堂va视频va在线 | 国产亚洲精品久久久久久大师 | 一区二区不卡高清 | 国产日韩欧美在线观看 | 国产一区久久 | 九九精品视频在线 | 91精品视频在线观看免费 | 国产精品videossex国产高清 | 久久免费国产电影 | 99在线免费观看视频 | 国产成人精品一区在线 | 狠狠色丁香久久婷婷综合五月 | 99亚洲国产精品 | 在线高清av | 精品久久网站 | 99久久婷婷国产综合亚洲 | 日韩激情小视频 | 成人免费观看视频网站 | 免费观看的黄色 | 亚洲欧洲日韩在线观看 | 亚洲精品中文字幕在线观看 | 成人黄色免费在线观看 | 美女国产在线 | 美女网站视频久久 | 日韩,中文字幕 | 日韩亚洲国产中文字幕 | 久久不见久久见免费影院 | 超碰人人草人人 | 国产在线一区观看 | 中文字幕乱码一区二区 | 久久久久激情电影 | 成人在线视频在线观看 | 国内综合精品午夜久久资源 | 精品五月天 | 人人爱天天操 | 色在线免费 | 免费a级毛片在线看 | 国产在线精品福利 | 久久黄色影院 | 欧美久久综合 | 免费看一级一片 | 亚洲视频综合在线 | 国产精品久久久久一区二区国产 | 又黄又爽又刺激 | 亚洲欧洲国产视频 | 成人九九视频 | 97超碰在线久草超碰在线观看 | 成 人 黄 色 视频免费播放 | 国产高清区 | 日韩免费福利 | 亚洲日本欧美在线 | 欧美日韩中文另类 | 91福利视频免费观看 | 黄色三级在线 | 操高跟美女| 午夜视频在线观看网站 | 国产成人精品在线观看 | 国产 日韩 在线 亚洲 字幕 中文 | 激情在线网 | 91在线精品播放 | 亚洲精品xxx | 久久精品亚洲国产 | 日韩三级中文字幕 | 成人av一区二区兰花在线播放 | 狠狠久久综合 | 日韩a在线看| 天天综合网天天综合色 | 麻豆精品视频 | 国产91大片 | 久久最新网址 | 久久tv| 亚洲国产剧情av | 日韩欧美在线观看一区二区三区 | adc在线观看 | 国产精品精品国产色婷婷 | 丝袜美腿一区 | 91视频链接 | 久久久麻豆精品一区二区 | 亚洲黄色在线观看 | 国产电影黄色av | 午夜久操| 日韩av电影一区 | 狠狠精品 | 免费观看一区 | 97视频免费在线观看 | 国产中文字幕视频在线观看 | 中文字幕免费观看全部电影 | 久久久久久久久久影院 |