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 (например, 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"
person
Juan Cespedes
schedule
13.08.2014