1.什麼是偽終端
偽終端對於一個程序來說,看上去像一個終端,但事實上並不是一個真正的終端。下圖顯示了使用偽終端時相關進程
的典型結構。
1.通常一個進程打開偽終端主設備,然後調用fork。子進程建立了一個新的會話,打開一個相應的偽終端從設備,將其文件
描述符復制到標准輸入、標准輸出和標准出錯,然後調用exec。偽終端從設備成為子進程的控制終端。
2.對於偽終端從設備之上的用戶進程來說,其標准輸入、標准輸出和標准出錯都是偽終端設備。對於這些文件描述符,用戶
進程可以調用所有的輸入輸出函數。但是因為在偽終端從設備之下並沒有真正的終端設備,無意義的函數調用(改變波特率等)
將被忽略。
3.任何寫到偽終端主設備的東西都會作為從設備的輸入,反之亦然。事實上所有從設備端的輸入都來自於偽終端主設備上的
用戶進程。這看起來就像一個雙向管道,但從設備上的終端行規程使我們擁有普通管道沒有的其他處理能力。
偽終端的典型用途是網絡登錄服務器rlogind。一旦登錄shell運行在遠端主機上,即可得到如下如的結構。telnetd服務器使用
類似的結構。
2.打開偽終端設備
posix_openpt用來打開下一個可用的偽終端主設備,該函數是可移植的。
[cpp] view
plain copy
#include<stdlib.h>
#include<fcntl.h>
int posix_openpt(int oflag); //成功則返回下一個可用的PTY主設備的文件描述符,出錯則返回-1。
參數oflag是一個位屏蔽字,指定如何打開主設備,它類似於open的oflag參數,但是並不支持所有打開標志。對於posix_openpt,
我們可以指定O_RDWR,要求打開主設備進行讀、寫;可以指定O_NOCTTY以防止主設備成為調用者的控制終端。其他
打開標志會導致未定義的行為。
在偽終端從設備可被使用之前,必須設置它的權限,使得應用程序可以訪問它。grantpt函數提供這樣的功能。它把從設備
節點的用戶ID設置為調用者的實際用戶ID,設置其組ID為一個非指定值,通常是可以訪問該終端設備的組。將權限設置為:
對單個所有者是讀寫,對組所有者是寫。
[cpp] view
plain copy
#include<stdlib.h>
int grantpt(int filedes);
int unlockpt(int filedes);
//這兩個函數返回值:若成功則返回0,出錯則返回-1。
unlockpt函數用於准許對偽終端從設備的訪問,從而允許應用程序打開該設備。阻止其他進程打開從設備後,建立該設備的
應用程序有機會在使用主從設備之前正確地初始化這些設備。
注意:在grantpt和unlockpt這兩個函數中,文件描述符參數是與主偽終端關聯的文件描述符。
ptsname函數用於在給定主偽終端設備的文件描述符時,找到從偽終端設備的路徑名。這使應用程序可以獨立於給定平台的
某種慣例而標識從設備。注意,該函數返回的名字可能存放在靜態存儲區中,所以以後的調用可能會覆蓋它。
[cpp] view
plain copy
#include<stdlib.h>
char *ptsname(int filedes); //若成功則返回指向PTY從設備名的指針,出錯則返回NULL。
上文來自:http://blog.csdn.net/TODD911/article/details/20927763