【问题标题】:Should POSIX `read()`'s `buf` be `signed` or `unsigned`? Does it even matter?POSIX `read()` 的 `buf` 应该是 `signed` 还是 `unsigned`?这还重要吗?
【发布时间】:2018-06-25 14:12:26
【问题描述】:

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

传入的实际缓冲区是chars 还是unsigned chars 的数组是否重要?如果是这样,我应该使用哪一个?我用谷歌搜索并阅读了这个人,但连缓冲区的 type 都没有提到,更不用说它的签名了。

【问题讨论】:

  • 所以read 不在乎,但您可能会考虑稍后将如何处理这些数据。例如,如果是文本char 可能会很好。
  • 读取为unsigned char 具有无填充和无陷阱值的 C 规范优势 - 与其他类型不同。
  • 代码读取后对数据做了什么?

标签: c posix unsigned signed


【解决方案1】:

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

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

【讨论】:

  • 那么当 read(div_t_value, sizeof(struct div_t)) 返回 3 时怎么办?
  • @Joshua 什么?!
  • @Joshua 假设这不是结构的大小,就像您将其读入char[sizeof(struct div_t)] 并想在读取成功时将其读入memcpy 一样:您发出错误有关损坏的输入文件的消息。 (编辑:如果您的意思是之后要读取更多字节,但read 并没有在第一时间返回它们,仍然与您读入char[sizeof(struct div_t)] 相同:发出另一个read。 )
  • @hvd:短读不是错误。您应该使用read(fd, (char*)&divobj+3, sizeof(div_t)-3); 恢复,就像使用read 时一样。如果有人不喜欢这样做,使用 stdio/fread 可能更符合他们的喜好。无论如何,以这样的小尺寸调用 read 几乎总是一个性能错误......
  • @R.. 在我最初的评论中,我认为 EOF 是短读的原因,但在我编辑的评论中,我确实涵盖了你已经提出的观点。
【解决方案2】:

传入的实际缓冲区是chars 还是unsigned chars 的数组是否重要?

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

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

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

【讨论】:

  • 其他选项效果不佳。您可能会在第一次调用中从管道中读取 3 个字节,并且必须发出另一个 read() 调用。
  • @Joshua,其他选择也可以。您说得对,需要考虑部分读取的可能性,但这是一个正交的考虑。
【解决方案3】:

“read() 尝试从文件描述符 fd 中读取 count 个字节到缓冲区,从 buf 开始。”

Read() 将存储文件描述符中的 bytes(可以是文件、套接字或其他)。

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

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

【讨论】:

    【解决方案4】:

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

    read() 函数应尝试从与打开的文件描述符 fildes 关联的文件中读取 nbyte 字节到 buf 指向的缓冲区中。

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-11-06
      • 2020-11-30
      • 2013-04-29
      • 2016-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      • 2013-06-22
      相关资源
      最近更新 更多