僞終端

引言

在終端和運行的程序之間有一個終端行規程(見http://www.cnblogs.com/nufangrensheng/p/3575752.html中的圖18-2),經過它咱們可以在終端上設置特殊字符(退格、行刪除、中斷等)。可是,當一個登錄請求到達網絡鏈接時,終端行規程並非自動被加載到網絡鏈接和登錄程序shell之間的。 html

概述

僞終端這個術語暗示對於一個應用程序而言,它看上去像一個終端,但事實上僞終端並非一個真正的終端下圖顯示了使用僞終端時相關進程的典型結構。其中關鍵點以下: typescript

    一般一個進程打開僞終端設備,而後調用fork。子進程創建了一個新會話,打開一個相應的僞終端從設備,將其描述符複製到標準輸入、標準輸出和標準出錯,而後調用exec。僞終端從設備成爲子進程的控制終端。 shell

  1. 對於僞終端從設備上的用戶進程來講,其標準輸入、標準輸出和標準出錯都是終端設備。對於這些文件描述符,用戶進程可以調用終端I/O章節中介紹的全部輸入/輸出函數。可是由於在僞終端從設備之下並無真正的終端設備,無心義的函數調用(改變波特率、發送中斷符、設置奇偶校驗等)將被忽略。
  2. 任何寫道僞終端設備的東西都會做爲從設備的輸入,反之亦然。事實上全部從設備端的輸入都來自於僞終端主設備上的用戶進程。這看起來像一個雙向管道,但從設備上的終端行規程使咱們擁有普通管道沒有的其餘處理能力。

咱們一般用pty表示僞終端,而用tty表示終端。 服務器

僞終端的典型用途

  1. 網絡登陸服務器

    僞終端可用於構造網絡登陸服務器。典型的例子是telnetd和rlogind服務器。一旦登錄shell運行在遠端主機上,便可獲得以下圖所示的結構。Telnetd服務器使用相似的結構。 網絡

    在rlogind服務器和登陸shell之間有兩個exec調用,這是由於login程序一般是在兩個exec之間檢驗用戶是否合法。 函數

    本圖的另外一個關鍵點是驅動PTY主設備的進程一般同時在讀寫另外一個I/O流。圖中另外一個I/O流是TCP/IP框。這表示該進程必然使用瞭如select或poll那樣的I/O多路轉接,或被分紅兩個進程或線程。 spa

  2. script程序

    script(1)程序是隨大多數UNIX系統提供的,它將終端會話的全部輸入和輸出信息複製到一個文件中。它將本身置於終端和登陸shell的一個新調用之間,從而完成此工做。下圖詳細描述了script程序中有關的交互。這裏要特別指出,script程序一般是從登陸shell啓動的,該shell而後等待script程序的結束。 線程

    Script程序運行時,位於PTY從設備之上的終端行規程的全部輸出都被複制到script文件中(一般叫作typescript)。由於擊鍵一般由該行規程模塊回顯,因此該script文件也包括了輸入的內容。可是,由於鍵入的口令(密碼)不被回顯,因此該文件不會包含口令。 htm

  3. expect程序

    僞終端能夠用來在非交互模式中驅動交互程序的運行。許多程序須要一個終端才能運行,passwd(1)命令就是一個例子,它要求用戶在系統提示後輸入命令。 blog

    爲了支持處理操做模式而修改全部交互式程序,是很是麻煩的。相比之下,一個更好的解決方法是經過一個腳原本驅動交互式程序。Expect程序提供了這樣的方法,它使用僞終端來運行其餘程序。

  4. 運行協同進程

    程序清單15-10(http://www.cnblogs.com/nufangrensheng/p/3561379.html)所示的協同進程例子中,咱們不能調用使用標準I/O庫進行輸入、輸出的協同進程,這是由於當經過管道與協同進程進行通訊時,標準I/O庫會將標準輸入和輸出的內容放到緩衝區中,從而引發死鎖。若是協同進程是一個已經編譯的程序而咱們又沒有源程序,則沒法在源程序中加入fflush語句來解決這個問題。圖15-8(http://www.cnblogs.com/nufangrensheng/p/3561379.html)顯示了一個進程驅動協同進程的狀況。咱們需要作的是將一個僞終端放到兩個進程之間(以下圖所示),這誘使協同進程認爲它是由終端而非另外一個進程驅動的。

    如今協同進程的標準輸入和標準輸出就像終端設備同樣,因此標準I/O庫會將這兩個流設置爲行緩衝。

  5. 觀看長時間運行程序的輸出

    使用任何一個標準shell,能夠將一個須要長時間運行的程序放到後臺去運行。可是若是將該程序的標準輸出重定向到一個文件,而且它產生的輸出又很少,那麼咱們就不能方便地監控程序的進展,這是由於標準I/O庫會將標準輸出所有放在緩衝區中。咱們看到的將只是標準I/O庫函數寫到輸出文件中的成塊輸出,有時甚至是大到8192字節的一塊。

    若是有源程序,則能夠加入fflush調用。另外一種方法是,能夠在pty程序下運行該程序,讓標準I/O庫認爲標準輸出是終端。下圖說明了這個結構,咱們將這個緩慢輸出的程序稱爲slowout。從登陸shell到pty進程的fork/exec箭頭用 虛線表示,以強調pty進程是做爲後臺任務運行的。

相關文章
相關標籤/搜索