2012-01-04 61 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