我想知道read()
函数在向套接字描述符传递给它时以及文件描述符传递给它时如何工作。在文件描述符的情况下,它总是按指定返回 n 字节,如果没有 n 字节,则返回更少。但是,如果是套接字描述符,则不需要返回 n 字节。因此,为了确保我们是否收到 n 字节,我们必须放置一个应用程序逻辑并记录我们收到的字节数,并在计数时终止ñ即可。我的问题是,为什么我们在从文件中读取时不必放置应用程序逻辑?
答案 0 :(得分:3)
阅读read(2)手册页:
man 2 read
你最好假设它总是可以返回一个字节数小于你传递给它的整个缓冲区(特别是因为它可能很难知道文件描述符是指一个套接字,一个tty,还是其他一些设备,管道,fifo或某些普通文件,还因为您可能有一些文件系统具有非POSIX兼容的语义)。您也可能已经到达文件末尾(EOF)等...
对于TCP套接字,请记住它们只是一个字节流,并且可以通过多次读取等接收给定的单个发送等...特别是,消息块可以通过“网络”进行拆分/重组(例如路由器)。
对于普通文件,请记住,当您的进程正在阅读时,其他一些进程可能会更改它(例如写入,截断它等等。)