2010-11-08 30 views
5

我想寫我自己的psuedo-shell並希望得到漂亮的顏色等。我該如何去欺騙一個子進程,認爲它是在TTY中?我已經閱讀了關於虛擬TTY的內容,但是還沒有找到關於如何創建一個或者如何讓一個子過程認爲是isatty(stdout) == 1的實用信息。對isatty作出響應的文件(3)

回答

8

你在找什麼叫做pseudoterminals,pseudo-ttys或ptys。它們存在於主/從對中,其行爲類似於套接字對(管道的雙向版本;寫入一端的內容可以在另一端讀取)。在控制過程中,使用posix_openpt打開高手,那麼ptsname獲得奴隸的名字(可能/dev/pts/X):

int master = posix_openpt(O_RDWR | O_NOCTTY); 
grantpt(master);  /* change ownership and permissions */ 
unlockpt(master); /* must be called before obtaining slave */ 
int slave = open(ptsname(master), O_RDWR | O_NOCTTY); 

像往常一樣,每個功能可能會失敗,所以添加錯誤檢查。現在,slave fd指的是從設備。在子進程中使用dup2(slave, STDOUT_FILENO)將標準輸出設置爲從僞終端;類似於stdin和stderr。

(請注意,some Linux manpages錯誤地指出posix_openpt返回char *此外,不要被openpty家庭的功能混淆;這些代表舊的接口,僞ttys中被棄用。)

+1

除了' STDOUT_FILENO',你也應該'將'pty奴隸'複製到孩子的'STDIN_FILENO'和'STDERR_FILENO'。 – caf 2010-11-08 12:09:47

+0

編輯,謝謝。 – 2010-11-08 12:12:04

+0

很好的答案,謝謝! – 2010-11-08 14:36:57