tcsetattr(): TCSANOW, TCSADRAIN, TCSAFLUSH 和 TCSASOFT 有什么区别

Are*_*yan 5 c io terminal input output

我已经阅读了GNU 手册tcsetattr(),它指出该函数具有三个参数:一个文件描述符、一个解释如何处理排队 I/O 的值和一个指向struct termios. 但是,我不明白不同值 ( TCSANOW, TCSADRAIN, TCSAFLUSH, TCSASOFT)之间的区别是什么。

有人可以解释一下吗?

Jon*_*ler 6

POSIX 规范tcsetattr()说:

  • 如果 optional_actions 是 TCSANOW,则更改应立即发生。

  • 如果 optional_actions 是 TCSADRAIN,则在所有写入 fildes 的输出传输后发生更改。更改影响输出的参数时应使用此功能。

  • 如果 optional_actions 是 TCSAFLUSH,则更改将在写入到 fildes 的所有输出传输后发生,并且在更改之前应丢弃迄今为止接收到但未读取的所有输入。

这些要点是,如果您正在写入串行终端,则可能需要一些时间来刷新写入的数据。不同的值可确保在您需要时发生更改。

TCSASOFT 是针对 BSD 和 Linux 定制的。您可以从您引用的手册页中看到:

  • TCSANOW — 立即进行更改。

  • TCSADRAIN — 在等待所有排队的输出写入后进行更改。在更改影响输出的参数时,通常应使用此选项。

  • TCSAFLUSH — 这类似于 TCSADRAIN,但也会丢弃任何排队的输入。

  • TCSASOFT — 这是一个标志位,您可以将其添加到上述任何替代方案中。它的意思是禁止改变终端硬件的状态。它是一个 BSD 扩展;它仅在 BSD 系统和 GNU/Hurd 系统上受支持。

    使用 TCSASOFT 与在 termios-p 指向的结构体的 c_cflag 成员中设置 CIGNORE 位完全相同。有关 CIGNORE 的说明,请参阅控制模式。

CIGNORE 不是 POSIX 属性。