Выход Strace не отображает системный вызов

Я читаю исходный код coreutils, и я пришел к чтению кода tty.c Основная функция tty следующая:

 int main (int argc, char **argv) { char *tty; int optc; initialize_main (&argc, &argv); set_program_name (argv[0]); setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); initialize_exit_failure (TTY_WRITE_ERROR); atexit (close_stdout); silent = false; while ((optc = getopt_long (argc, argv, "s", longopts, NULL)) != -1) { switch (optc) { case 's': silent = true; break; case_GETOPT_HELP_CHAR; case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS); default: usage (TTY_FAILURE); } } if (optind < argc) error (0, 0, _("extra operand %s"), quote (argv[optind])); tty = ttyname (STDIN_FILENO); if (!silent) { if (tty) puts (tty); else puts (_("not a tty")); } exit (isatty (STDIN_FILENO) ? EXIT_SUCCESS : EXIT_FAILURE); } 

По моему пониманию, строка, которая получает текущую tty, равна tty = ttyname (STDIN_FILENO); Но когда я запускаю tty используя strace в выводе strace нет вызова ttyname . Какова причина?

Вот вывод strace:

 > strace -c tty /dev/pts/3 % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 0.00 0.000000 0 1 read 0.00 0.000000 0 1 write 0.00 0.000000 0 3 open 0.00 0.000000 0 5 close 0.00 0.000000 0 1 stat 0.00 0.000000 0 5 fstat 0.00 0.000000 0 10 mmap 0.00 0.000000 0 4 mprotect 0.00 0.000000 0 2 munmap 0.00 0.000000 0 3 brk 0.00 0.000000 0 2 ioctl 0.00 0.000000 0 1 1 access 0.00 0.000000 0 1 execve 0.00 0.000000 0 1 readlink 0.00 0.000000 0 1 arch_prctl ------ ----------- ----------- --------- --------- ---------------- 100.00 0.000000 41 1 total 

Нет ttyname – это список!

Причина в том, что имя ttyname(3) не является системным вызовом , это функция библиотеки C. Вы можете проверить его реализацию, например, в glibc , чтобы узнать, какие системные вызовы он использует сам (и которые вы увидите в результате вывода strace ).

Чтобы отслеживать вызовы библиотеки в Linux, вы можете использовать ltrace (который также может отслеживать системные вызовы). (Спасибо Marki555 за предложение.)