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提案。 )