что эквивалентно recvmsg в python?

Я реализую скрипт python для программного монтирования предохранителей. Я написал эквивалент на C, используя API socketpair и recvmsg. Но в python recvmsg не реализован, поэтому я застрял. Может ли кто-нибудь из вас сказать мне эквивалент этого на Python? Любая помощь будет оценена по достоинству.

Расскажу зачем мне recvmsg, я требую отправить фд фьюзмаунт от дочернего к родителю.


person hue    schedule 11.06.2011    source источник
comment
Он еще не добавлен в Python, см. bugs.python.org/issue6560.   -  person X-Istence    schedule 11.06.2011
comment
Нет. Насколько я знаю, нет способа реализовать recvmsg, используя то, что в настоящее время доступно в Python. Какие данные вы отправляете с помощью recvmsg? Можно ли вместо этого использовать стандартную розетку?   -  person X-Istence    schedule 11.06.2011
comment
Я тоже столкнулся с этим. Я нанес удар, но далеко не продвинулся.   -  person Keith    schedule 11.06.2011


Ответы (2)


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

Другие вещи, которые вы можете сделать, это написать небольшую оболочку C, которая обрабатывает recvmsg, и только после того, как она получит этот fd и откроет его, он не сделает вилку. Все открытые файловые дескрипторы останутся открытыми при разветвлении, а затем exec или даже просто старомодном exec, что означает, что вам не нужно беспокоиться о том, что Python их получит.

person X-Istence    schedule 21.06.2011

Как часть Python3 теперь доступен socket.recvmsg в модуле socket, который, согласно документам, должен позволить вам делать то, что вы хотите (хотя и довольно поздно!):

В некоторых системах sendmsg() и recvmsg() могут использоваться для передачи файловых дескрипторов между процессами через сокет AF_UNIX. При использовании этого средства (часто оно ограничено сокетами SOCK_STREAM) функция recvmsg() будет возвращать в своих вспомогательных данных элементы вида (socket.SOL_SOCKET, socket.SCM_RIGHTS, fds), где fds — это байтовый объект, представляющий новые файловые дескрипторы в виде двоичного массива собственного типа C int. Если recvmsg() вызывает исключение после завершения системного вызова, он сначала попытается закрыть все файловые дескрипторы, полученные с помощью этого механизма.

person Pierz    schedule 08.11.2017