使用ps的时候,可以显示进程的终端
$ ps
PID TTY TIME CMD
31313 pts/4 00:00:00 bash
31900 pts/4 00:00:00 ps
那么,ps是怎么获取的信息呢?
1 读取/proc/pid/stat
第7列,就是tty_nr,tty设备的id。
第8列,就是tty_pgrp,表示tty设备的feregound process group
$ cat /proc/31313/stat
31313 (bash) S 31164 31313 31313 34820 31986 4194304 13449 108166 0 8 7 7 77 50 20 0 1 0 7585731 14573568 1385 18446744073709551615 94448572293120 94448573015765 140723805266128 0 0 0 65536 3670020 1266777851 1 0 0 17 8 0 0 0 0 0 94448573246704 94448573294084 94448588689408 140723805267531 140723805267537 140723805267537 140723805269998 0
比如上面ps的bash进程的,tty_nr就是34820,这是10进制,转成16进制就是:8804
2 找到 tty_nr 所在的 tty设备
读取 /proc/tty/drivers
$ cat /proc/tty/drivers
/dev/tty /dev/tty 5 0 system:/dev/tty
/dev/console /dev/console 5 1 system:console
/dev/ptmx /dev/ptmx 5 2 system
/dev/vc/0 /dev/vc/0 4 0 system:vtmaster
ttyprintk /dev/ttyprintk 5 3 console
max310x /dev/ttyMAX 204 209-224 serial
serial /dev/ttyS 4 64-111 serial
pty_slave /dev/pts 136 0-1048575 pty:slave
pty_master /dev/ptm 128 0-1048575 pty:master
unknown /dev/tty 4 1-63 console
可以枚举出所有的tty路径。由于上述tty_nr是8804,也就是是第4个,这应该就是/dev/pts/4
$ stat /dev/pts/4
File: /dev/pts/4
Size: 0 Blocks: 0 IO Block: 1024 character special file
Device: 18h/24d Inode: 7 Links: 1 Device type: 88,4
Access: (0620/crw--w----) Uid: ( 1000/ yuan) Gid: ( 5/ tty)
Access: 2024-08-07 18:54:10.165447694 +0800
Modify: 2024-08-07 18:54:10.165447694 +0800
Change: 2024-08-07 15:24:59.165447694 +0800
Birth: -
使用stat命令,实际调用stat()系统调用。查看 st_rdev 成员,就是0x8804
参考
https://docs.kernel.org/filesystems/proc.html