POSIX `read()` 的 `buf` 应该是 `signed` 还是 `unsigned`?这有关系吗?

Should POSIX `read()`'s `buf` be `signed` or `unsigned`? Does it even matter?

POSIX 读取函数定义为 ssize_t read(int fd, void *buf, size_t count);,将其 buf 参数作为 void*.

实际传入的缓冲区是char数组还是unsigned char数组有关系吗?如果是这样,我应该使用哪一个?我用谷歌搜索并阅读了这个人,但甚至没有提到缓冲区的 类型 ,更不用说它的签名了。

声明类型 void * 的原因是您几乎可以读取任何类型。你可以读一个char。你可以读一个unsigned char。如果您之前写入文件的内容也是 int,则您可以读取 int。您可以读取 struct div_t,如果那是写入文件的内容。

选择写入文件的任何类型,或者如果您正在读取任意字节,则选择最适合您以后处理的类型。

Does it matter if the actual buffer passed in is an array of chars or unsigned chars?

没有。此外,这些不是您唯一的选择。第二个参数指向的缓冲区可以有 any 对象类型。它指向 char 数组或 unsigned char 数组是相当常见的,但它指向某个(其他)整数类型的数组或结构对象的情况并不少见类型,或其他东西。

主要的objective是根据发送方想要的数据类型来解释接收到的数据,这需要您事先知道或者能够从数据中确定想要的类型。换句话说,发送方和接收方需要就某种通信协议达成一致。

最简单的协议是无差别的字节流;为此,unsigned char 数组是最合适的选择。其他一些选择更适合其他协议。

"read() attempts to read up to count bytes from file descriptor fd into the buffer starting at buf."

Read() 将从您的文件描述符(可以是文件、套接字或其他)存储 字节

字节将存储在您的指针地址,无论其类型如何。您的程序理解这些字节的方式取决于您声明它的方式。

因此,例如,相同的字节 0xFF 可能会在 buf 声明时被您的程序解释为 255 或 -1

来自 http://pubs.opengroup.org/onlinepubs/009695399/functions/read.html:

The read() function shall attempt to read nbyte bytes from the file associated with the open file descriptor, fildes, into the buffer pointed to by buf.

如何解释字节由您决定。 bufchar 数组还是 unsigned char 数组对 read 的工作方式没有影响。只有您决定如何解释数据。如果文件中包含的数据不是 char,如果将它们视为 char 的数组,您可能最终会误解其内容。这又取决于您的平台。

将数据解释为unsigned char的数组也不一定正确。文件中的数据可能是 floats 的数组或包含混合数据类型的 struct 的数组。

底线 - 您需要将数据读入内存中适当的对象类型。为此,您必须知道文件中保存的内容。