2016-06-01 3 views
0

Моя цель - создать концепцию для демонов, которые взаимодействуют локально (т. Е. Не через сеть) с другими процессами, все с разными идентификаторами/правами пользователя.Как передать файл filedescriptor по именованному каналу

Чтобы ограничить доступ к демонам процессам с нужными уровнями доступа, я Повсеместно следующей концепции:

  • Каждый демон открывает именованный канал для чтения в /foo/{daemon-name}
  • доступ к этому имени трубы можно легко управлять с помощью обычных прав доступа к файлам, поэтому другие процессы, не входящие в правильную группу пользователей, не будут иметь права на запись в трубу
  • Изменение прав доступа к демону позже легко выполняется без необходимости перекомпилирования
  • процесса, который хочет общаться с демоном посылает один конец socketpair() через именованный канал и связь продолжается через эту ссылку

Таким образом, каждый Dameon может реализовать свой собственный API или пакетный формат для общения через socketpair , Но не было бы необходимости в аутентификации и так, потому что права доступа к именованному каналу уже позаботились о том, чтобы только конкретная группа могла отправлять сокет-пару для связи.

Теперь единственная проблема, с которой я сталкиваюсь, заключается в том, что я не могу получить передачу файлового дескриптора socketpair() для работы над именованным каналом. sendmsg(), по-видимому, не работает на именованных каналах.

Как я могу отправить один из 0dsfds через именованный канал, чтобы демон мог получить доступ к соединению и начать общение?

+0

Вы можете передавать файловые дескрипторы через сокеты, но я не думаю, что это возможно, используя именованный канал. Рассмотрите возможность использования сокета для связи с вашим dæmon. – fuz

ответ

1

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

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

Поскольку вы пытаетесь создать соединение сокета между вашим демоном и клиентскими процессами, просто используйте сокеты Unix-домена, чтобы получить такое соединение напрямую. Разрешения файловой системы работают с сокетами Unix-домена так же, как и для именованных каналов.