Технически почти все возможно с ptrace ()
/ gdb
. Результаты поиска .
Использование ptrace ()
зависит от архитектуры, неудобно, и, AFAICT, никто не реализовал это за вас. Популярным приложением является внедрение файлового дескриптора в процесс, но это примерно противоположное тому, что вы хотите.
Я думал о том, что потребуется, и это выглядит очень болезненно.
Вы можете использовать подход сценария gdb и посмотреть исходный код screenify . Вероятно, все еще очень неудобно передавать FD изнутри gdb. Способ передачи fds заключается в отправке их как «вспомогательных данных» с помощью sendmsg ()
через сокет unix.
К сожалению, отправка дополнительных данных обычно выполняется с помощью макроса. Хотя gdb
производит потрясающее впечатление от интерпретатора C, я не думаю, что можно использовать макросы.
Другой способ передачи fds - использование fork ()
, что может предоставить несколько более простых вариантов (в сочетании с exec ()
). К сожалению, похоже, что ptrace ()
и fork ()
не лучшие друзья.Есть несколько специфичных для Linux команд gdb , которые могут выполнять эту работу, но в них упоминается только поддержка точек останова; он не говорит, можете ли вы заставить команду gdb вызвать fork ()
, чтобы она работала разумно. Даже если это сработает, вам, возможно, придется повозиться и с FD_CLOEXEC
(close-on-exec). Это тоже макрос.
Нетрудно найти числовое значение простого макроса (так был написан screenify). Макроинтерфейс для отправки вспомогательных данных не очень сложен, поэтому вместо этого может быть проще перепроектировать его.