计算 posix read() 收到的字节数

Counting bytes received by posix read()

我对一行代码感到困惑:

temp_uart_count = read(VCOM, temp_uart_data, 4096); 

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

temp_uart_count用于统计我们从虚拟COM端口接收到多少字节,并存储到temp_uart_data,也就是4096字节宽。

通过这行代码,我真的得到了多少字节吗?

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

如果 returns -1 这表明发生了错误,您需要检查 errno 变量以了解发生了什么。

ssize_t read(int fd, void *buf, size_t count); returns你他读取的字节大小存入你传入参数的值。当错误发生时,它 returns -1(errno 设置为 EINTR)或 return 已读取的字节数..

来自 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.

... but if everything is okay it returns 0, so how we can get num of bytes received from that?

A return 零代码仅表示 read() 无法提供任何数据。

Am I really getting how much bytes i received with this line of code?

是的,来自 read() 的正 return 代码(即 >= 0)是 returned 中的准确字节数缓冲区。零是有效计数。

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


And - zero indicates end of file

If you get 0, it means that the end of file (or an equivalent condition) has been reached and there is nothing else to read.

以上(一个来自评论,另一个来自答案)不正确。
从 tty 设备(例如串行端口)读取不像从块设备上的文件读取,而是暂时的。读取数据仅在通过 comm link 接收时可用。

非阻塞 read() 将 return 和 -1 和 errno 设置为 EAGAIN 当没有可用数据时。

阻塞的非规范 read() 将在没有可用数据时 return 归零。将您的 termios 配置与 this 相关联以确认 return 为零是有效的(并且不表示“文件结尾").

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