如何从内核模块获取进程的进程TPGID? (内核模式)

时间:2019-04-23 10:10:54

标签: c linux process kernel-module tty

我想通过使用内核函数来获取内核模块中进程的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

0 个答案:

没有答案