Chromium OS 中 fread 的实现是由什么构成的?
What is this implementation of fread in Chromium OS made of?
我看着source code of fread in chromium-os / glibc,越来越疑惑了。
注意:我说的是源代码,而不是 fread or other 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(register FILE *stream)
我对这行特别疑惑:
int c = __fillbf(stream);
并且无法在任何地方找到此功能。我认为这可能是一个我还不知道的系统调用,但它不是 the table
的一部分
那么__fill_bf(register FILE *)
背后的真正代码是什么?
编辑:感谢 dyp 的宏定义,Crowman 的 __fillbf
和 Ray 很好的综合解释!
ps:也欢迎任何关于 fread 棘手部分的额外解释的答案!
DEFUN
在 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,这将是 ansidecl.h.) DEFUN 调用将因此扩展为所使用的编译器的适当 decl 格式。
__fillbf
正如 Crowman 在评论中提到的,__fillbf
的定义在 internals.c 中。看起来它将一块字符读入内部缓冲区,因此 fgetc
可以一次读取一个字符,而无需每次都进行磁盘访问。
我看着source code of fread in chromium-os / glibc,越来越疑惑了。
注意:我说的是源代码,而不是 fread or other 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(register FILE *stream)
我对这行特别疑惑:
int c = __fillbf(stream);
并且无法在任何地方找到此功能。我认为这可能是一个我还不知道的系统调用,但它不是 the table
的一部分那么__fill_bf(register FILE *)
背后的真正代码是什么?
编辑:感谢 dyp 的宏定义,Crowman 的 __fillbf
和 Ray 很好的综合解释!
ps:也欢迎任何关于 fread 棘手部分的额外解释的答案!
DEFUN
在 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,这将是 ansidecl.h.) DEFUN 调用将因此扩展为所使用的编译器的适当 decl 格式。
__fillbf
正如 Crowman 在评论中提到的,__fillbf
的定义在 internals.c 中。看起来它将一块字符读入内部缓冲区,因此 fgetc
可以一次读取一个字符,而无需每次都进行磁盘访问。