pus*_*rnk 3 c linux gcc gnu libc
我运行的是 32 位 SUSE Linux,内核级别为 3.0.76。
我可以看到代码中的 stat() 调用在 strace 输出中转换为 stat64(),而无需指定任何 CPP 选项,例如 _LARGEFILE64_SOURCE 或 _FILE_OFFSET_BITS=64。
#include<stdio.h>
#include<sys/stat.h>
int main ( int argc, char * argv[] )
{
char * path = "nofile";
struct stat b;
if (stat(path, &b) != 0) {
}
}
Run Code Online (Sandbox Code Playgroud)
我用 gcc 编译了这个文件,没有编译器选项/标志。
运行程序时,相关的 strace 输出为:
munmap(0xb770a000, 200704) = 0
stat64("nofile", 0xbfb17834) = -1 ENOENT (No such file or directory)
exit_group(-1)
Run Code Online (Sandbox Code Playgroud)
谁能告诉我 stat() 是如何转换为 stat64() 的?
提前致谢!
答案似乎可以在 stat 手册页中找到
随着时间的推移,stat 结构体大小的增加导致了 stat() 的三个连续版本:sys_stat()(插槽 __NR_oldstat)、sys_newstat()(插槽 __NR_stat)和 sys_stat64()(内核 2.4 中的新功能;插槽 __NR_stat64) )。glibc stat() 包装函数向应用程序隐藏这些详细信息,调用内核提供的最新版本的系统调用,并在旧二进制文件需要时重新打包返回的信息。类似的注释适用于 fstat() 和 lstat()。
基本上,glibc 总是调用 stat64。
如果添加 a printf("%zu\n", sizeof b);,struct stat则大小可能会有所不同,具体取决于您是否使用 _FILE_OFFSET_BITS=64 ,并且 glibc 会struct stat在内核和代码之间进行转换。
| 归档时间: |
|
| 查看次数: |
2553 次 |
| 最近记录: |