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제안. )

관련 정보