Как я могу получить дескриптор процесса из PID в ядре Linux? - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь выяснить, как получить дескриптор процесса из PID.

С http://www.linuxforums.org/forum/kernel/153873-getting-task_struct-process-using-its-pid.html, для ядра Linux 2.4

static inline struct task_struct *find_task_by_pid(int pid)
{
    struct task_struct *p, **htable = &pidhash[pid_hashfn(pid)];

    for(p = *htable; p && p->pid != pid; p = p->pidhash_next)
        ;

    return p;
}

Ссылка, кажется, говорит, что pidhash[pid_hashfn(pid)] является указателем на task_struct объект, чей PID является значением pid.

Но, похоже, это не так из книги «Понимание ядра Linux», в которой говорится о ядре Linux 2.6.11. Я не уверен, что соответствующий код одинаков в 2.6.11 и 2.4. Из книги я узнал, что pidhash[pid_hashfn(pid)] имеет тип hlist_head, который является указателем на объект hlist_node. Объект hlist_node является pids[0].pid_chain объекта task_struct. Тогда как я могу получить объект task_struct из pidhash[pid_hashfn(pid)]?

Обратите внимание, что

Спасибо.

1 Ответ

0 голосов
/ 17 сентября 2018

В ядре 2.6.11 task_struct содержит массив pids[PIDTYPE_MAX], поэтому задание одновременно помещается в несколько хеш-таблиц.

pidhash содержитуказатели на PIDTYPE_MAX хеш-таблиц.pidhash[i] - указатель на начало i -ой хеш-таблицы.Таким образом, pidhash[type][pid_hashfn(nr)] является указателем на связанный список.

Лучше найти struct pid * для записи в элементе задачи [pids[type]] с заданным типом pid type и pid nr с использованием ядраФункция find_pid(type, nr).

Затем вы можете преобразовать (не NULL) указатель в struct pid в указатель на struct task_struct, используя макрос container-of на основе pid_task.

...