Новые форумы для: пользователей, администраторов, математиков и филологов.
4

Есть модуль, осуществляющий хук некоторых системных вызовов, необходимо определить полный путь к образу процесса, который осуществил системный вызов. Сейчас получаю

current->pid

после чего делаю

sys_readlink((char*)link, buf, bufsize);

от

/proc/#PID#/exe

получая почти всегда полный путь, но для некоторых процессов (например, chrome иногда) вместо полного пути возвращается только имя процесса. Есть ли другой способ определить полный путь к образу вызывающего процесса ?

задан 20 Фев 20:38

AnMakc's gravatar image

AnMakc
513

изменен 20 Фев 20:43

И безотносительно к модулям ядра вопрос интересный.

Насколько я понимаю, *nix-ы полный (да и неполный) путь к файлу существует (как реальность), только в момент конкретного системного вызова.

Для системы файл это i-node. Путей к нему может быть несколько (а в данный момент и вообще уже ни одного (?) (ну, в этом я не уверен, пройдет ли unlink() для исполняющегося в этот момент файла?)).

Простого способа найти путь к иноду не вижу.

Я понимаю, что Вы читаете символьный линк, в котором хотите обнаружить путь, а его там иногда нет, т.е. комментарий не совсем в тему.

(20 Фев 22:31) avp

Не берусь утверждать, но unlink() к образу действующего процесса скорее всего не пройдет - области памяти, которая помечена как исполняемая, должно быть задано соответствующее отображение на файловую систему (тот самый образ процесса), впрочем это достаточно просто проверить.

(20 Фев 23:15) AnMakc
2

Для файла загрузочного модуля исполняющейся программы unlink(), rename() (rm, mv) работают, touch тоже, а вот запись в этот файл не разрешается

avp@avp-xub11:~/hashcode$ cat >a.out 
bash: a.out: Текстовый файл занят

Собственно чего это я в своем предыдущем комментарии засомневался в этом ?

Очевидно ведь, что изменения в каталоге не связаны с изменениями самого файла.

P.S.

"Текстовый файл занят" - ну не дурацкий ли перевод "text file busy" ? Где они таких "русификаторов" набрали ?

(21 Фев 11:18) avp
3

Есть такая функция proc_pid_cmdline. Я уверен, что либо она сама, либо ее содержимое будет полезно. Однако надо заметить, что получение полного имени процесса не всегда возможно. Скорее всего это врядли получится в контексте обработчика прерывания.

ссылка

отвечен 21 Апр 9:02

kkvt's gravatar image

kkvt
1312

Кирилл, а это не то же самое, что прочитать файл /proc/PID/cmdline ?

(21 Апр 14:14) northerner

Зависит от того, что в конкретный момент вам доступнее и удобнее. Результат, очевидно, будет один и тот же.

(21 Апр 14:57) kkvt

Да, результат, естественно тот же что и при чтении /proc/PID/cmdline. Дело в том, что он далеко не всегда содержит именно путь к исполняемому образу.

За функцию спасибо, поизучаю, возможно что-то полезное для себя вытащу.

(24 Апр 22:22) AnMakc
Ваш ответ

Если вы не нашли ответ, задайте вопрос.

Здравствуйте

ХэшКод - это совместно редактируемый форум вопросов и ответов для начинающих и опытных программистов.

Присоединяйтесь!

отмечен:

×1,529
×344
×5
×2

задан
20 Фев 20:38

показан
148 раз

обновлен
24 Апр 22:22

Отслеживать вопрос

по почте:

Зарегистрировавшись, вы сможете подписаться на любые обновления

по RSS:

Ответы

Ответы и Комментарии