与信号一样,终端 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 定义的各种函数一起使用,例如 tcsetattr 和tcgetattr。该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.