与 ls -l 相比,ls 命令需要系统调用吗?

ls command required system calls compared to ls -l?

所以基本上我有一个任务要使用 strace 进行分析,ls 命令需要哪些系统调用才能提供与 ls -l 相同的信息。

但是 ls -l 命令有很多奇怪的系统调用,例如 stat 64 被调用时每个文件都使用 /etc/localtime 作为参数? 示例(对当前目录中的每个文件重复此操作):

stat64( "/etc/localtime", {st_mode=S_IFREG|0644,
st_size=1892, ...}) = 0
write(1, "-rwxrwxr-x 1 john john 10441"..., 55-rwxrwxr-x
1 john john 10441 jan 1 14:39 stattest
) = 55
stat64( "/etc/localtime", {st_mode=S_IFREG|0644,
st_size=1892, ...}) = 0
write(1, "-rw-rw-r-- 1 john john 320"..., 57-rw-rw-r--
1 john john 320 jan 1 14:39 stattest.c
) = 57

为什么每个文件都以本地时间作为参数调用 stat64?似乎有点奇怪。 难道不应该通过 stat 调用获得所有相关文件信息吗?为什么 ls -l 需要使用 lstat 和许多其他不同的奇怪调用、套接字连接等

有人可以帮我弄清楚基本系统调用什么来实际获取命令 ls 中缺少的相关信息,这是由 ls -l 给出的吗?

谢谢!

stat64 调用可能由某些 libc 函数调用,以将文件时间转换为您当地的时区。由于函数调用不会在幕后保留时区信息(如果程序在执行中途更改时区怎么办?),每次调用时都会发生这种情况。

如果您想找出具体是哪个函数在执行此操作,请使用 gdb 捕获系统调用并查看堆栈跟踪(有关详细信息,请参阅 catch syscall 上的 GDB 文档)。