ltrace
показывает вызов библиотеки.В этом случае он показывает функцию из libc
, которую вызывает исходный код.
Если вы видите исходный код pwd
, вы увидите (coreutils-8.13, файл lib / xgetcwd.c):
char *cwd = getcwd (NULL, 0);
Итак, вывод ltrace
правильный: pwd
выполняет getcwd(NULL, 0)
.Согласно справочной странице Linux getcwd(3)
:
getcwd () динамически распределяет буфер с помощью malloc (3), если buf равен NULL.
Однако системный вызовgetcwd(2)
всегда нужен первый аргумент, отличный от NULL, чтобы скопировать туда путь.Вы можете увидеть, как это делается в исходном коде libc (eglibc-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"