如何获取当前终端名称?
我指的是ps在TTY列中显示的名称,例如:
root@dor-desktop:/home/dor/Documents/LAMP_setup/webs_install/do/install# ps aux | egrep 'mysql|(^USER)'
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
dor 2238 0.2 1.9 448052 79796 ? S 17:27 0:17 gedit /home/dor/Documents/LAMP_setup/webs_install/do/install/mysql.install /home/dor/Documents/LAMP_setup/webs_install/do/install/mysql.setup
root 4975 0.1 0.5 324984 22876 ? S 18:12 0:04 gedit /usr/local/mysql/bin/mysqld_safe
root 8160 0.0 0.0 4108 664 pts/2 S 19:08 0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --skip-networking --skip-grant-tables --user=mysql --basedir=/usr/local/mysql --ledir=/usr/local/mysql/libexec
mysql 8279 0.0 0.4 146552 19032 pts/2 Sl 19:08 0:00 /usr/local/mysql/libexec/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/var --user=mysql --skip-networking --skip-grant-tables --log-error=/usr/local/mysql/var/dor-desktop.err --pid-file=/usr/local/mysql/var/dor-desktop.pid --socket=/usr/local/mysql/mysql.sock --port=3306
root 8342 0.0 0.0 7632 1024 pts/2 R+ 19:14 0:00 egrep --color=auto mysql|(^USER)在上面的示例中,我需要获取pts/2,它可能是执行这些命令的当前终端的名称。
发布于 2013-05-31 16:18:54
tty现在我必须输入30个字符3就足够了.:-)
发布于 2015-06-18 19:08:35
Re:“你可以简单地解释一下这个命令是什么,它能做什么,你还能用它做什么,而且你还能用它做些什么呢?这是一个更好的答案。”
当前终端的Unix名称(或者控制台,我们老用户有时也会这样称呼它)是: /dev/tty,可以用来从命令提示符( cp /dev/tty README.md )轻松地创建一个新的多行文件(点击然后将光标放在一个新的空白行上,您可以输入文本、再次点击返回、输入第二行等等)。当完成输入行时,执行一个control,这将导致cp命令退出,您将使用一个命令创建一个多行文件)。
发布于 2020-11-04 16:24:36
Re:“你可以简单地解释一下这个命令是什么,它能做什么,你还能用它做什么,而且你还能用它做些什么呢?这是一个更好的答案。”
或者我们可能会发疯,说“去看看源代码,了解更多信息”。所以我就这么做了。
要在tty.c中实际获取名称,在STDIN_FILENO上调用一个辅助函数ttyname。这两种方法都是在unistd.h中定义的(为了证明,运行grep "STDIN_FILENO\|ttyname" /usr/include/unistd.h),通过#include "system.h" (go 这里,查看system.h)将它们拖到tty.c中。
现在,ttyname是在glib_c/sysdeps/posix/ttyname.c中定义的外部依赖项。它反过来是fstats文件描述符STDIN_FILENO (0),并使用函数gettyname实际检索指向tty名称的指针。fstat最终导致了fxstat.c中的一个INLINE_SYSCALL,它最终调用了一个internal_syscall2,在这一点上,我运气不好。我真不知道那有什么用。
但是,我认为它调用了stat在fd 0上的功能。它做了所有这一切,确保不停留在"stdin“或类似的东西。无论哪种方式,您都可以通过查看
stat /dev/stdin # -> /proc/self/fd/0
stat /proc/self/fd/0 # -> /dev/pts/<some number>那么/dev/pts/<some number>就是你的tty。
我正试着把事情搞清楚,但我不会像上面那样详细。到目前为止,我已经推断出,syscall间接性结束于一个名为vfs_fstat的函数,该函数随后调用函数fdget_raw,该函数立即调用__fget_light。这使用了一个宏current,它返回在这里定义的get_current的结果:
static __always_inline struct task_struct *get_current(void)
{
return this_cpu_read_stable(current_task);
} 无论如何,task_struct有一个类型为files_struct的条目files,我猜它使files列表与当前任务相关联。这是一个数组,fd是数组的索引。为了结束所有这些,我们只需要找出fd 0在这个数组中的真正含义(即,当任务创建时,实际放置在那里的是什么)。然后,我们只需要在源代码中看到,如果/proc/self准确地反映了这个数组,那么我们就可以确定我们认为发生的事情确实发生了……
https://unix.stackexchange.com/questions/77796
复制相似问题