strace 出力にシステムコールは表示されません。

strace 出力にシステムコールは表示されません。

tty.c私はcoreutilsのソースコードを見ていますが、コードを読むためにここに来ました。主な機能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); 出力でusingを実行するとtty呼び出されません。なぜですか?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提案。 )

関連情報