c-计算posix read()接收的字节数



我对一行代码感到困惑:

temp_uart_count = read(VCOM, temp_uart_data, 4096); 

我在上找到了更多关于读取功能的信息http://linux.die.net/man/3/read,但如果一切正常,它会返回0,那么我们如何才能从中获得接收到的字节数呢?

temp_uart_count用于计算我们从虚拟COM端口接收到的字节数,并将其存储到4096字节宽的temp_uart_data中。

我真的知道这行代码收到了多少字节吗?

但如果一切正常,它会返回0,那么我们如何才能从中获得接收到的字节数呢?

返回代码为零意味着read()无法提供任何数据。

我真的知道这行代码收到了多少字节吗?

是的,read()的正返回代码(即>=0)是缓冲区中返回的字节数。零是有效计数。

如果您需要更多的数据,那么只需重复read()系统调用。(但是,您可能设置termios参数不好,例如VMIN=0和VTIME=0)。


和-零表示文件结束

如果得到0,则表示已达到文件结尾(或等效条件),并且没有其他内容可读取。

以上(一个来自评论,另一个来自回答)是不正确的
从tty设备(例如串行端口)读取不同于从块设备上的文件读取,而是暂时的。用于读取的数据只有在通过通信链路接收时才可用。

当没有可用数据时,非阻塞的read()将返回-1,并且errno设置为EAGAIN

当没有可用数据时,阻塞的非规范读取()将返回零。将termios配置与此关联,以确认返回零是有效的(并且不表示"文件结束")。

在任何一种情况下,read()都可以在到达时重复以获取更多数据
此外,当使用非规范(也称为原始)模式(或非阻塞读取)时,不要期望或依赖read()为您执行消息或数据包管理。您需要在程序中添加一个层来读取字节,将这些字节连接到一个完整的消息数据报/数据包中,并在处理该消息之前对其进行验证。

ssize_t read(int fd, void *buf, size_t count);返回他读取的字节大小,并将其存储到参数中传递的值中。当发生错误时,它返回-1(errno设置为EINTR)或返回已读取的字节数。。

来自linux人:

On files that support seeking, the read operation commences at the current file offset, and the file offset is incremented by the number of bytes read. If the current file offset is at or past the end of file, no bytes are read, and read() returns zero.

是的,temp_uart_count将包含实际读取的字节数,显然这个数字将小于或等于temp_uart_data的元素数。如果得到0,则表示已达到文件末尾(或等效条件),并且没有其他内容可读取。

如果它返回-1,则表示发生了错误,您需要检查errno变量以了解发生了什么。

最新更新