【问题标题】:What is this implementation of fread in Chromium OS made of?Chromium OS 中的 fread 实现是由什么组成的?
【发布时间】:2021-03-01 16:26:29
【问题描述】:

我看着 source code of fread in chromium-os / glibc 并对此越来越感到困惑。

注意:我说的是源代码,而不是 freadother related questions


作为宏的函数原型

首先我对 fread 被声明为宏的方式感到惊讶,它的函数名,然后是它的参数,最后是它的参数类型:

/* Read NMEMB chunks of SIZE bytes each from STREAM into P.  */

size_t
DEFUN(fread, (p, size, nmemb, stream),
      PTR p AND size_t size AND size_t nmemb AND register FILE *stream)

这背后的基本原理是什么,为什么不这样做

size_t fread(PTR p, size_t size, size_t nmemb, register FILE * stream)

哪个更易读?


什么是__fillbf(注册文件*流)

我对这行特别疑惑:

int c = __fillbf(stream);

并且无法在任何地方找到此功能。我认为这可能是一个我还不知道的系统调用,但它不属于the table

那么__fill_bf(register FILE *)背后的真实代码是什么?

编辑:感谢 dyp 的宏定义,Crowman__fillbfRay 的精彩综合解释!

ps:任何关于 fread 棘手部分的额外解释的答案也欢迎!

【问题讨论】:

  • 铬,它在超链接中,抱歉我删除了``以使其更明显
  • 关于 DEFUN:chromium.googlesource.com/chromiumos/third_party/glibc/+/cvs/… "它成为 ANSI C 中的原型,以及传统 C 中的类型声明。"
  • __fillbf 定义在 internals.c 的起始行 591
  • @Crowman 谢谢!!在哪里可以找到 internals.c 的源代码?
  • 请注意,__fillbf() 没有机会成为系统调用,因为 FILE * 仅涉及用户空间/libc。

标签: c libc


【解决方案1】:

定义

在 ANSI 标准化之前,函数声明有不同的语法:

ANSI 声明:

int f(int x, double y) {
...
}

前 ANSI (K&R1) 声明:

f(x, y)
int x;
double y;
{
...
}

DEFUN 这样的宏通常是为可能需要由非常旧的编译器编译的程序定义的。 (现在不太常见了,因为 ANSI 标准化发生在 1989 年。)如果使用 ANSI/ISO C,将有一个文件以一种方式定义宏,如果使用 pre-ANSI C,则以另一种方式定义宏。(对于 chromiumos,那将是 @ 987654321@.) DEFUN 调用将因此扩展为正在使用的编译器的适当 decl 格式。

__fillbf

正如 Crowman 在 cmets 中提到的,__fillbf 的定义在 internals.c 中。看起来它会将一个字符块读入一个内部缓冲区,这样fgetc 可以一次读取一个字符,而无需每次都访问磁盘。

【讨论】:

    猜你喜欢
    • 2011-09-14
    • 1970-01-01
    • 2010-09-22
    • 2011-03-20
    • 2013-03-11
    • 1970-01-01
    • 2011-01-09
    • 2010-10-02
    相关资源
    最近更新 更多