ltrace 显示库调用。在这种情况下,它显示了源代码正在调用的来自libc 的函数。
如果你看到pwd的源码,你会看到(coreutils-8.13,文件lib/xgetcwd.c):
char *cwd = getcwd (NULL, 0);
所以,ltrace 的输出是正确的:pwd 执行 getcwd(NULL, 0)。根据Linux手册页getcwd(3):
如果 buf 为 NULL,getcwd() 会使用 malloc(3) 动态分配缓冲区。
但是,系统调用getcwd(2) 总是需要一个不同于 NULL 的第一个参数,以便在那里复制路径名。您可以在 libc 源代码中看到这是如何完成的(例如 libc-3.13,文件 sysdeps/unix/sysv/linux/getcwd.c)。
库调用getcwd(NULL, 0) 执行系统调用getcwd(path, alloc_size),其中path 是先前malloc() 的结果,alloc_size 是页面大小(4096)。
为了确认这一点,如果你运行ltrace -S pwd,你会看到库调用和系统调用:你会看到类似:
getcwd(NULL, 0 <unfinished ...>
SYS_getcwd("/root", 4096) = 6
<... getcwd resumed> ) = "/root"