strace 输出不显示系统调用

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); 但是当我在 的输出中运行ttyusing时,没有调用.是什么原因?stracestracettyname

这是 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是名单!

答案1

原因是ttyname(3)不是一个系统调用,它是一个 C 库函数。你可以查看它的实现,例如 glibc,查看它使用自己的系统调用什么(然后您将在strace的输出中看到)。

要跟踪 Linux 上的库调用,您可以使用跟踪(也可以跟踪系统调用)。 (谢谢马基555的建议。)

相关内容