【问题标题】:Is read(2) part of the C89 specification?read(2) 是 C89 规范的一部分吗?
【发布时间】:2016-09-02 22:54:30
【问题描述】:

我对 C 有点陌生。我想知道,read(2) 函数是 C89 规范的一部分,还是只是 POSIX 规范的一部分?我问是因为我试图找出read 的返回类型,而here 等地方的手册页说它是ssize_t。但是,ssize_t 仅在 POSIX 中是必需的,而不是根据 this question 的常规 C。 This MSDN page 似乎证实了我的怀疑,因为它说

不推荐使用此 POSIX 函数。请改用符合 ISO C++ 标准的 _read。

我拿到了draft of the C89 standard,目录中没有提到read。但是,提到了freadhttp://port70.net/~nsz/c/c89/c89-draft.html#4.9.8.1

那么最好使用例如fread(buf, 1, sizeof(buf), stdin) 而不是 read(STDIN_FILENO, buf, sizeof(buf)) 用于从标准输入读取?

编辑:很抱歉给您带来了困惑。我没有引用 MSDN 来暗示 read 已被弃用,只是为了表明它确实是 POSIX 标准的一部分(它提到了“POSIX 函数”),而不是 C 标准。

【问题讨论】:

  • read 函数不是标准的 C 函数,只有 POSIX。如果你想要便携,你应该改用fread(和相关函数)。
  • read(2) 是 POSIX。就 IO 而言,ISO C 仅处理标准流。如果想要同时超级便携和高效,您可以在stdin 中禁用缓冲并使用fread
  • Microsoft 平台上,Microsoft 已弃用对 read 的支持,而不是 POSIX
  • 使用 MS 作为 C 的参考是个坏主意。自 17 年以来,他们拒绝支持 C 标准。他们还放弃了对 POSIX 的支持,因此它们对于 POSIX 相关问题也是一个不好的参考。引用显然来自一些 C++ 文档,这是一种不同的语言。对于 C 来说也是一个糟糕的资源。
  • @AndrewHenle @yellowantphil @Olaf 和其他人,我并没有引用 MSDN 来暗示 read 已被弃用,只是为了表明它确实是 POSIX 标准的一部分(它提到“POSIX 功能") 而不是 C 标准。

标签: c posix fread


【解决方案1】:

read() 不是而且从来不是标准 C,所以如果你想编写从文件读取的可移植代码,请不要使用它;使用fread()

另一方面,您可能希望在 Posix 系统上做一些不可移植的事情,例如使用管道和套接字。在这种情况下,继续使用 Posix 接口。

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 2017-04-11
    • 2011-11-06
    • 2014-12-16
    相关资源
    最近更新 更多