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
호출되지 않습니다. 이유는 무엇입니까?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
목록이에요!
답변1
왜냐하면ttyname(3)
하나도 아니야시스템 호출, 이는 C 라이브러리 함수입니다. 구현을 확인할 수 있으며,예를 들어 존재하다glibc
를 사용하여 자체 시스템 호출을 사용하는 내용을 확인합니다(이후 의 strace
출력에서 볼 수 있음).
Linux에서 라이브러리 호출을 추적하려면 다음을 사용할 수 있습니다.길(시스템 호출도 추적할 수 있습니다.) (감사해요마키 555제안. )