我正在编写一个作为测试套件一部分的工具,该套件需要通过串行端口与某些硬件进行通讯,以便所测试的代码能够看到环境的变化。
所以,我这样做:
open("/dev/tty.usbmodem14141", O_RDWR | O_NOCTTY);
只有它挂在那里。如果我将通话替换为
open("/dev/tty.usbmodem14141", O_RDWR | O_NOCTTY | O_NONBLOCK);
然后它可以工作-但我不想不必摆弄select()和朋友,也不必写忙循环的轮询,这样我就可以从串行端口读取数据了;这就是阻塞I / O的目的。
我需要做一些特别的事情吗?
答案 0 :(得分:0)
在非阻塞模式下打开串行终端后,可以清除文件状态标志以在阻塞模式下执行I / O。
要清除非阻塞状态标志,您可以使用fcntl(),例如:
int flags;
flags = fcntl(fd, F_GETFL);
flags &= ~O_NONBLOCK;
fcntl(fd, F_SETFL, flags);
由于Linux版本的F_SETFL只能更改O_APPEND,O_ASYNC,O_DIRECT,O_NOATIME和O_NONBLOCK标志,因此通常的做法是将代码简化为
fcntl(fd, F_SETFL, 0);
(是的,单衬里的可移植性与Setting Terminal Modes Properly中提倡的程度不同。)