【发布时间】:2016-02-21 10:19:37
【问题描述】:
我想知道read() 函数在将套接字描述符传递给它以及将文件描述符传递给它时如何工作。对于文件描述符,它总是返回指定的 n 个字节,如果没有 n 个字节,则返回更少。但是,对于套接字描述符,它没有必要返回 n 个字节。因此,为了确保我们是否收到了 n 个字节,我们必须放置一个应用程序逻辑并记录我们收到的字节数,并在计数为 n。我的问题是,为什么我们在读取文件时不必放置应用程序逻辑?
【问题讨论】:
-
但是你知道。如果您的文件小于
n怎么办? -
好吧,假设我们知道文件的大小。因此,如果我们从文件 desc 中读取这么多字节,它总是会返回这么多字节。但是假设它是一个套接字,我们从中读取了很多字节? @SanderDeDycker
-
所以你很幸运。它没有被指定为那样的行为,所以你不能依赖它。
-
如果您希望您的套接字具有类似的行为,请确保它是blocking socket。请注意,尽管忽略
read的返回值仍然不安全,因为它仍然不能保证返回n(由于本地缓冲区中还没有所有数据可用,套接字被关闭,信号中断, ...)
标签: c linux sockets system-calls