Saída de Strace não mostrando a chamada do sistema

3

Estou lendo o código-fonte do coreutils e vim ler tty.c code. A função principal de tty é a seguinte:

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);
}

Para mim, a linha que obtém a tty atual é tty = ttyname (STDIN_FILENO); Mas quando executo tty usando strace na saída de strace , não há chamada para ttyname . Qual é o motivo?

Aqui está a saída do 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

Não ttyname é a lista!

    
por coffeMug 14.06.2016 / 15:20

1 resposta

5

A razão é que ttyname(3) não é um chamamento de sistema , é uma função da biblioteca C. Você pode verificar sua implementação, por exemplo, em glibc , para ver quais chamadas de sistema ele usa (e quais você verá na saída de strace ).

Para rastrear chamadas de bibliotecas no Linux, você pode usar o ltrace (que também pode rastrear chamadas do sistema). (Obrigado a Marki555 pela sugestão.)

    
por 14.06.2016 / 15:25

Tags