C write()在调用close(fd)之前不发送数据

Kri*_*ina 7 c linux serial-port tty

所以我有这个测试代码通过USB串口发送"HELLO":

int fd;
struct termios tty;

if((fd = open("/dev/ttyUSB0", O_WRONLY|O_NONBLOCK|O_NOCTTY)) == -1){
err(1, "Cannot open write on /dev/ttyUSB0");
}

tcgetattr(fd, &tty);
tty.c_iflag = 0;
tty.c_oflag = 0;
tty.c_lflag = 0;
tty.c_cflag = 0;
tty.c_cc[VMIN] = 0;
tty.c_cc[VTIME] = 0;
cfsetospeed(&tty, B19200);
cfsetispeed(&tty, B19200);
tty.c_cflag |= CREAD|CRTSCTS|HUPCL|CS8;
tcsetattr(fd, TCSANOW, &tty);

printf("Write: %i\n", write(fd, "HELLO", 5));

sleep(5);

if(close(fd) != 0){
warn("Could not close write fd");
}
Run Code Online (Sandbox Code Playgroud)

程序执行正常,"HELLO"被发送,但有一个问题.调用write()函数时似乎没有发送"HELLO",而是在文件描述符关闭时发送.我添加了上面的sleep(5)行来测试这个理论,果然,"HELLO"在程序执行后约5秒发送.如何在write()命令之后立即发送"HELLO"而不是close()?

Jer*_*myP 8

该设备是一个tty设备,所以fsync不会有帮助,也许不会fflush.

默认情况下,设备在规范模式下工作,这意味着数据被打包成行单元.您可能会发现在数据中添加cr/lf对将导致它被发送.

您需要确保规范模式已关闭.此外,R的答案将是有用的.

http://en.wikibooks.org/wiki/Serial_Programming/termios


Lou*_*cio 5

从手册页write():

从write()成功返回并不能保证数据已提交到磁盘.事实上,在一些错误的实现上,它甚至不能保证已成功为数据保留空间.唯一可以确定的方法是在完成所有数据写入后调用fsync(2).

您需要调用fsync()文件描述符以确保实际提交数据.

  • 无关.问题是终端设备处于行缓冲模式. (7认同)