Ядро: получение командной строки и pid_parent в do_execve_common?

Можно ли получить командную строку процесса, который должен быть создан в do_execve_common ядра Linux? Другими словами, как извлечь командную строку из argv и напечатать ее в dmesg.

Во-вторых, можно ли также получить pid и родительский pid процесса? Доступна ли эта информация где-то в do_execve_common?

Мне нужно делать эти вещи ТОЛЬКО в ядре.


person gregoiregentil    schedule 07.03.2013    source источник


Ответы (1)


Я думаю, что к моменту вызова do_execve поля pid, real_parent и comm в task_struct уже инициализированы.

Таким образом, вы можете использовать функции ядра: getpid(), getppid() и get_task_comm(), чтобы получить то, что вы хотите. Я не уверен, что эти функции есть в вашей версии ядра Linux. Если нет, то должны быть какие-то аналогичные функции.

person tian_yufeng    schedule 07.03.2013
comment
Я не думаю, что это отвечает на мой вопрос. Например, getpid возвращает pid текущего процесса, здесь я в ядре. Мне нужен pid процесса, который должен быть создан или только что создан. Я был бы в порядке, если бы получил информацию в последней строке do_execve_common. - person gregoiregentil; 07.03.2013
comment
Принести извинения! Вызов находится в контексте процесса, поэтому sys_getpid может работать. Я все еще не понимаю всех аргументов. Я думал, что эта ссылка mail-archive.com/kernelnewbies@nl .linux.org/msg00278.html поможет, но не работает. Не знаю, почему... - person gregoiregentil; 07.03.2013
comment
Я отмечу этот ответ, хотя он дает только половину решения (pid, но не аргументы). Я открыл еще один вопрос о том, как извлечь argv из linux_binprm: stackoverflow.com/questions/15275594 - person gregoiregentil; 07.03.2013
comment
@gregoiregentil getpid возвращает pid текущего процесса, здесь я в ядре ... в контексте процесса, вызывающего execve. Все системные вызовы по-прежнему выполняются в контексте процесса, даже если вы выполняете код ядра. - person Jonathon Reinhart; 28.05.2015