2012-01-04 90 views
2

當我打開一個終端運行bash和鍵入以下內容:如何通過管道發送文件結束而不關閉管道?

cat\nfoo\n^Decho bar\n 

(其中\ n被輸入和^ d是控制-d)獲得:

foo 
bar 

即,^ d原因貓退出,但我仍然可以輸入更多。
如何通過C中的(unix)管道發送相同的輸入(特別是文件結束)?

回答

6

xterm不會通過shell和實用程序通過pipe(7) s執行輸入。相反,它使用Unix PTY框架(有關信息,請參閱pty(7),openpty(3),forkpty(3),forkpty(3),posix_openpt(3),pts(4)聯機幫助頁)。 PTY框架允許任何進程作爲終端「主」(例如,telnetd(8),sshd(8),xterm(1)等),並且任何進程都可以連接到終端從站以提供交互式環境,就像坐在控制檯上一樣。

Advanced Programming in the Unix Environment, 2nd editionStevens and Rago對使用​​僞終端裝置來控制從機程序的最佳章 - 包括一個極好的小pty程序,允許驅動以類似於expect(1)的方式「交互式」的節目,但在C,而不是tcl

+1

......哇,我真的忘了unix是多麼的糟糕。 +1,希望將pty打入半工作管道界面不會太難。 – 2012-01-04 01:41:37

3

Control-D對終端而言是特殊的,而不是一般的輸入。只需關閉管道。

+0

不,我的意思是我該如何從當前讀取的管道讀取EOF,然後繼續寫入(如/ usr/bin/xterm)? – 2012-01-04 01:26:19

+2

導致讀者收到EOF錯誤的唯一方法是文件在最後;在所有可能的作者都關閉訪問權限之前,管道永遠不會結束。 EOF不是讀取的字符,而是文件的狀態。 – mah 2012-01-04 01:30:33

+1

那麼/ usr/bin/xterm(和其他終端仿真器)如何將EOF發送到其子進程? – 2012-01-04 01:33:24