2

问候,在将旧的 Solaris 2.4 代码移植到 CentOS 5.3 时,我遇到了一个类似的调用

/usr/bin/xterm -S%s%d ...

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

4

1 回答 1

1

根据solaris 联机帮助页,管道系统调用创建了两个双向管道。因此,在 solaris 上,您可以同时使用 fd 进行读取和写入:

与 fildes[0] 和 fildes 1相关联的文件是流,并且都以读写方式打开。

但是根据 linux 上的 pipe(2) 联机帮助页:

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

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

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


因此,在 linux 上,您不能将 pipefd 1(写入端)传递给 xterm,因为它需要一个 fd 进行双向通信。要使其工作,您必须使用 openpty() 并将从 fd 传递给 xterm。

AFAIK,openpty 在 Solaris 上不可用;这似乎是您的代码不使用它的原因。

于 2009-07-22T21:08:56.323 回答