Tty

Strace 輸出未顯示系統呼叫

  • June 14, 2016

我正在閱讀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); 但是當我在輸出中執行ttyusing時,沒有呼叫. 是什麼原因?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的輸出中看到)。

要在 Linux 上跟踪庫呼叫,您可以使用ltrace(它也可以跟踪系統呼叫)。(感謝Marki555的建議。)

引用自:https://unix.stackexchange.com/questions/289684