国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 操作系統 > 正文

偽終端

2024-06-28 13:27:41
字體:
來源:轉載
供稿:網友
偽終端引言

在終端和運行的程序之間有一個終端行規程(見http://www.CUOXin.com/nufangrensheng/p/3575752.html中的圖18-2),通過它我們能夠在終端上設置特殊字符(退格、行刪除、中斷等)。但是,當一個登陸請求到達網絡連接時,終端行規程并不是自動被加載到網絡連接和登陸程序shell之間的。

概述

偽終端這個術語暗示對于一個應用程序而言,它看上去像一個終端,但事實上偽終端并不是一個真正的終端。下圖顯示了使用偽終端時相關進程的典型結構。其中關鍵點如下:

????通常一個進程打開偽終端設備,然后調用fork。子進程建立了一個新會話,打開一個相應的偽終端從設備,將其描述符復制到標準輸入、標準輸出和標準出錯,然后調用exec。偽終端從設備成為子進程的控制終端。

  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多路轉接,或被分成兩個進程或線程。

  2. script程序

    script(1)程序是隨大多數UNIX系統提供的,它將終端會話的所有輸入和輸出信息復制到一個文件中。它將自己置于終端和登錄shell的一個新調用之間,從而完成此工作。下圖詳細描述了script程序中有關的交互。這里要特別指出,script程序通常是從登錄shell啟動的,該shell然后等待script程序的結束。

    Script程序運行時,位于PTY從設備之上的終端行規程的所有輸出都被復制到script文件中(通常叫做typescript)。因為擊鍵通常由該行規程模塊回顯,所以該script文件也包括了輸入的內容。但是,因為鍵入的口令(密碼)不被回顯,所以該文件不會包含口令。

  3. expect程序

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

    為了支持處理操作模式而修改所有交互式程序,是非常麻煩的。相比之下,一個更好的解決方法是通過一個腳本來驅動交互式程序。Expect程序提供了這樣的方法,它使用偽終端來運行其他程序。

  4. 運行協同進程

    程序清單15-10(http://www.CUOXin.com/nufangrensheng/p/3561379.html)所示的協同進程例子中,我們不能調用使用標準I/O庫進行輸入、輸出的協同進程,這是因為當通過管道與協同進程進行通信時,標準I/O庫會將標準輸入和輸出的內容放到緩沖區中,從而引起死鎖。如果協同進程是一個已經編譯的程序而我們又沒有源程序,則無法在源程序中加入fflush語句來解決這個問題。圖15-8(http://www.CUOXin.com/nufangrensheng/p/3561379.html)顯示了一個進程驅動協同進程的情況。我們須要做的是將一個偽終端放到兩個進程之間(如下圖所示),這誘使協同進程認為它是由終端而非另一個進程驅動的。

    現在協同進程的標準輸入和標準輸出就像終端設備一樣,所以標準I/O庫會將這兩個流設置為行緩沖。

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

    使用任何一個標準shell,可以將一個需要長時間運行的程序放到后臺去運行。但是如果將該程序的標準輸出重定向到一個文件,并且它產生的輸出又不多,那么我們就不能方便地監控程序的進展,這是因為標準I/O庫會將標準輸出全部放在緩沖區中。我們看到的將只是標準I/O庫函數寫到輸出文件中的成塊輸出,有時甚至是大到8192字節的一塊。

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 息烽县| 肥乡县| 淮北市| 建平县| 遂川县| 潍坊市| 松溪县| 翁源县| 安徽省| 涞源县| 凌云县| 咸阳市| 彭水| 东乌珠穆沁旗| 饶河县| 繁昌县| 泊头市| 桐庐县| 如东县| 靖西县| 宝应县| 进贤县| 阿合奇县| 鄯善县| 温宿县| 将乐县| 元江| 萨迦县| 沈丘县| 陵水| 桐庐县| 全南县| 徐闻县| 共和县| 遵化市| 兰坪| 汽车| 玛多县| 上饶市| 手机| 会昌县|