sky__sea 发表于 2015-07-01 10:42

关于获取终端地址的问题

我想在内核代码里获取到当前系统调用进程的用户和登陆的终端地址,也就是执行who命令获取到的信息,请问有什么办法吗,求高手指点,谢谢!

Godbach 发表于 2015-07-01 12:12

回复 1# sky__sea
看一下 who 的实现,以及对应的系统调用。


   

sky__sea 发表于 2015-07-01 12:42

看了,是在看不出来是在哪里得到的,我看在输出之前调用了stat,如下:
stat("/dev/pts/2", {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=405, ...}) = 0
但是stat貌似得不到吧?
回复 2# Godbach


   

Godbach 发表于 2015-07-01 16:24

回复 3# sky__sea

直接去看 who 的实现吧,没必要再 strace 跟踪了

   

sky__sea 发表于 2015-07-01 16:55

不好意思,我想知道哪里能看到who的实现,who里面本身都是很多系统调用,但是命令本身我还真不知道哪里能看到源代码?回复 4# Godbach


   

sky__sea 发表于 2015-07-01 17:14

知道了,都包含在 coreutils 软件包中,coreutils 软件包的源码可以在
htp://ftp.gnu.org/gnu/coreutils/找到

Godbach 发表于 2015-07-02 12:19

回复 6# sky__sea
:mrgreen:coreutils 是个好东东

此外,不知道某个命令是在哪个安装包,可以用下面这个命令

$rpm -qf `which who`
coreutils-8.4-16.1.alios6.x86_64


   

sky__sea 发表于 2015-07-02 16:57

谢谢大侠!回复 7# Godbach


   

nswcfd 发表于 2015-07-06 11:10

who的实现应是参考了utmp/wtmp记录,这些信息(登录时间、来源IP、甚至用户名)估计底层都没有?

当然底层有进程的控制终端的概念(对应who的终端信息),task_struct->signal_struct->tty

sky__sea 发表于 2015-07-06 14:56

你说的没错,我只能找到tty这一步了。回复 9# nswcfd


   
页: [1]
查看完整版本: 关于获取终端地址的问题