next up previous contents
下一个: 10.4 进程信息和 上一个: 10 将应用程序移植到 前一个: 10.2.4 支持的信号

10.3 终端 I/O

与信号一样,终端 I/O 控制在 SVR4、BSD 和 POSIX.1 下有三种不同的实现。

SVR4 使用termio结构,以及在终端设备上的各种 ioctl 调用(例如TCSETA, TCGETA等等)来获取和设置参数。termio结构。该结构看起来像

  struct termio {
    unsigned short c_iflag;  /* Input modes */
    unsigned short c_oflag;  /* Output modes */
    unsigned short c_cflag;  /* Control modes */
    unsigned short c_lflag;  /* Line discipline modes */
    char c_line;             /* Line discipline */
    unsigned char c_cc[NCC]; /* Control characters */
  };

在 BSD 下,sgtty结构与各种 ioctl 调用一起使用,例如TIOCGETP, TIOCSETP等等。

在 POSIX 下,termiosstruct 与 POSIX.1 定义的各种函数一起使用,例如 tcsetattrtcgetattr。该termios结构与struct termio由 SVR4 使用的结构相同,但类型被重命名(例如tcflag_t而不是unsigned short),并且NCCS用于c_cc数组的大小。

在 Linux 下,POSIX.1 termios 和 SVR4 termio 都由内核直接支持。这意味着如果您的程序使用这些方法中的任何一种来访问终端 I/O,它应该可以在 Linux 下直接编译。如果您有任何疑问,可以很容易地修改代码,使用termio使用termios,利用一些对这两种方法的了解。希望这永远不会是必要的。但是,如果程序尝试使用c_line字段,请注意在termio结构中。对于几乎所有应用程序,这应该是N_TTY,如果程序假定可以使用其他线路规程,您可能会遇到问题。

如果您的程序使用 BSD sgtty 实现,您可以链接到libbsd.a如上所述。这将为 ioctl 提供一个替换,它将根据内核使用的 POSIX 重新提交终端 I/O 请求termios调用。编译这样的程序时,如果诸如TIOCGETP等符号未定义,您将需要链接到libbsd.



转换于
1996 年 3 月 29 日星期五 14:43:04 EST