我想通过使用内核函数来获取内核模块中进程的TPGID(stat的字段8)而不访问/ proc / pid / stat文件。 TPGID:进程控制终端的前台进程组的ID。
这是针对Linux版本5.0.5。我尝试访问每个进程的task_struct和tty_struct中的各个字段,但是结果与ps ax -O tpgid
中的结果不匹配。
ps ax -O tpgid
输出
PID TPGID S TTY TIME COMMAND
5226 -1 S ? 00:00:00 urxvt
5227 5228 S pts/5 00:00:00 zsh
5228 5228 R pts/5 00:00:00 ps ax -O tpgid
21160 -1 S ? 00:00:01 urxvt
21161 712 S pts/0 00:00:00 zsh
23132 -1 S ? 00:00:00 urxvt
23133 23133 S pts/3 00:00:00 zsh
27134 -1 S ? 00:00:00 urxvt
27135 27135 S pts/2 00:00:00 zsh
29921 -1 S ? 00:00:01 urxvt
29922 3185 S pts/4 00:00:00 zsh
我在模块中尝试过的内容
static inline struct tty_struct *get_tty(struct task_struct *task)
{
struct tty_struct *tty;
unsigned long flags;
spin_lock_irqsave(&task->sighand->siglock, flags);
tty = tty_kref_get(task->signal->tty);
spin_unlock_irqrestore(&task->sighand->siglock, flags);
return tty;
}
tty = get_tty(task);
if (tty != NULL) {
task2 = pid_task(tty->pgrp, PIDTYPE_PGID);
tpgid = pid_vnr(task_pgrp(task2));
}
模块的dmesg输出
[12790.690217] 23133 (zsh) S session_id:23133 pgrp:23133 tpgid:23133
[12790.690221] 27134 (urxvt) S session_id:3421 pgrp:3421 tpgid:-1
[12790.690230] 27135 (zsh) S session_id:27135 pgrp:27135 tpgid:27135
[12790.690233] 29921 (urxvt) S session_id:3421 pgrp:3421 tpgid:-1
[12790.690242] 29922 (zsh) S session_id:29922 pgrp:29922 tpgid:3185
[12790.690251] 712 (vim) S session_id:21161 pgrp:712 tpgid:712
[12790.690255] 1178 (kworker/u16:1) I session_id:0 pgrp:0 tpgid:-1
[12790.690258] 3013 (kworker/u16:2) I session_id:0 pgrp:0 tpgid:-1
[12790.690267] 3185 (man) S session_id:29922 pgrp:3185 tpgid:3185
[12790.690276] 3193 (man) S session_id:29922 pgrp:3185 tpgid:3185