Tty
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
using時,沒有呼叫. 是什麼原因?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 庫函式。您可以查看它的實現,例如 inglibc
,以查看它自己使用的系統呼叫(然後您將在strace
的輸出中看到)。