我已经阅读了GNU manual for tcsetattr()并声明该函数有三个参数:一个文件描述符、一个解释如何处理排队I/O的值和一个指向struct termios的指针。但是,我不明白不同值(TCSANOWTCSADRAINTCSAFLUSHTCSASOFT,)之间的区别。
有人能解释一下吗?

最佳答案

tcsetattr()的POSIX规范说明:
如果可选操作是TCSANOW,则应立即进行更改。
如果可选操作是TCSADRAIN,则在发送写入fildes的所有输出之后,应发生更改。更改影响输出的参数时应使用此函数。
如果可选的_操作是TCSAFLUSH,则应在发送写入fildes的所有输出之后发生更改,并且在进行更改之前,应丢弃迄今为止接收到但未读取的所有输入。
关键是,如果您正在向串行终端写入数据,则写入的数据可能需要时间刷新。不同的值可以确保更改在需要时发生。
TCSASOFT one是BSD和Linux的定制版本。从您引用的手册页中可以看到:
TCSANOW-立即进行更改。
TCSADRAIN-在等待写入所有排队输出之后进行更改。在更改影响输出的参数时,通常应使用此选项。
TCSAFLUSH-这类似于TCSADRAIN,但也会丢弃任何排队输入。
TCSASOFT-这是一个标志位,可以添加到上述任何选项中。其含义是抑制终端硬件状态的改变。它是BSD扩展;仅在BSD系统和GNU/Hurd系统上受支持。
使用TCSASOFT与在termios-p points to结构的c廑cflag成员中设置CIGNORE位完全相同。有关CIGNORE的说明,请参见控制模式。
CIGNORE不是POSIX属性。

08-24 19:00