xterm的-S选项(传递伪终端名称和描述符)如何在Linux中运行?

时间:2009-07-22 16:25:23

标签: linux solaris xterm pty

问候, 在将旧的Solaris 2.4代码移植到CentOS 5.3时,我遇到了像

这样的调用
/usr/bin/xterm -S%s%d ...

其中%s是两个字符的数字序列XX,如00,01,%d是数字文件描述符。这显然是一种告诉xterm使用/ dev / ttypXX(一个伪终端从属)的方法,但代码似乎并没有打开相应的master,调用管道(2)而是传递 write fd作为上面的%d替换。在Solaris上,从spawner写入此写入fd会导致输出显示在xterm子级中。在一个strace(1)中,顺便说一句,我看到没有尝试在/ dev下打开任何东西。

1 个答案:

答案 0 :(得分:1)

根据solaris manpage,管道系统调用会创建两个双向管道。所以在solaris上你可以使用fds进行读写:

  

与fildes [0]和fildes 1相关联的文件是流,两者都是   开放阅读和写作。

但是根据linux上的pipe(2)手册页:

  

pipe()创建一个管道,一个可以使用的单向数据通道   用于进程间通信。

还要注意管道(7)中的以下内容:

  

在某些系统(但不是Linux)上,管道是双向的:数据可以是   在管端之间沿两个方向传输。根据   POSIX.1-2001,管道只需要是单向的。便携式应用   应该避免依赖双向管道语义。


因此,在Linux上,你不能将写入结束的pipefd 1传递给xterm,因为它期望fd用于双向通信。为了使它工作,你必须使用openpty()并将slave fd传递给xterm。

AFAIK,Solaris上没有openpty;这似乎是你的代码不使用它的原因。