получить _complete_ имя процесса из pid

Я нахожусь в модуле ядра и хочу получить полное имя процесса из данного pid. точно: мне нужна строка, которая хранится в /proc/PID/cmdline.

Проблема в том, что task_struct->comm[] имеет длину всего 15 байт и не обрабатывается, если программа изменяет его argv[] вручную или через setproctitle(3)...

Есть идеи? :)


person Community    schedule 23.09.2009    source источник


Ответы (2)


Вы всегда можете посмотреть, как это делает ядро. Вы увидите функцию:

proc_pid_cmdline(struct task_struct *task, char * buffer)

За этим довольно легко следить, но как только у вас есть task_struct для интересующего вас процесса, вы используете access_process_vm(), чтобы глотать биты, которые вы хотите, из mm->arg_start.

person stsquad    schedule 23.09.2009
comment
Я использовал эту функцию, НО с ней я не могу получить доступ ко всему argv, только к argv[0] :( - person ; 23.09.2009
comment
thomasbl: Вы получаете доступ ко всему argv, вы просто останавливаетесь на первом '\0', который является концом argv[0] — каждый элемент отделяется '\0'. - person caf; 24.09.2009
comment
спасибо за правильный ответ на мою проблему! Но вчера я не читал твой ответ, а сегодня нашел его сам :) - person ; 24.09.2009

Что плохого в том, чтобы открыть файл /proc/<pid>/cmdline и просто прочитать его содержимое?

person paxdiablo    schedule 23.09.2009
comment
проблема в том, что я перехватил системный вызов open(), и если я попытаюсь открыть /proc/pid/cmdline для чтения, я попаду в бесконечный цикл. - person ; 23.09.2009
comment
Разве вы не могли бы просто связать системный вызов? Другими словами, сохраните его последнее значение, прежде чем вы (так красноречиво) его украли. В этом случае вы сможете просто позвонить по старому. - person paxdiablo; 23.09.2009
comment
В противном случае вам пришлось бы предоставлять всю открытую функциональность в вашем перехвате, а не просто добавлять свой код для выполнения новых вещей и позволять самому ядру обрабатывать старые вещи. - person paxdiablo; 23.09.2009