首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得当前终端名称?

如何获得当前终端名称?
EN

Unix & Linux用户
提问于 2013-05-31 16:17:10
回答 3查看 43.9K关注 0票数 27

如何获取当前终端名称?

我指的是ps在TTY列中显示的名称,例如:

代码语言:javascript
复制
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,它可能是执行这些命令的当前终端的名称。

EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2013-05-31 16:18:54

代码语言:javascript
复制
tty

现在我必须输入30个字符3就足够了.:-)

票数 44
EN

Unix & Linux用户

发布于 2015-06-18 19:08:35

Re:“你可以简单地解释一下这个命令是什么,它能做什么,你还能用它做什么,而且你还能用它做些什么呢?这是一个更好的答案。”

当前终端的Unix名称(或者控制台,我们老用户有时也会这样称呼它)是: /dev/tty,可以用来从命令提示符( cp /dev/tty README.md )轻松地创建一个新的多行文件(点击然后将光标放在一个新的空白行上,您可以输入文本、再次点击返回、输入第二行等等)。当完成输入行时,执行一个control,这将导致cp命令退出,您将使用一个命令创建一个多行文件)。

票数 4
EN

Unix & Linux用户

发布于 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,在这一点上,我运气不好。我真不知道那有什么用。

但是,我认为它调用了statfd 0上的功能。它做了所有这一切,确保不停留在"stdin“或类似的东西。无论哪种方式,您都可以通过查看

代码语言:javascript
复制
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的结果:

代码语言:javascript
复制
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准确地反映了这个数组,那么我们就可以确定我们认为发生的事情确实发生了……

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/77796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档