Как экспортировать открытые файловые дескрипторы для исключенных детей - PullRequest
1 голос
/ 23 ноября 2011

Каковы переносимые опции, если необходимо экспортировать дескрипторы открытых файлов в дочерние процессы, созданные с использованием семейства библиотечных функций exec?

Спасибо.

EDIT. Я знаю, что дочерние процессы наследуют открытые дескрипторы. Но как они используют эти дескрипторы, не зная их значений? Должен ли я реализовать какой-либо IPC для передачи дескрипторов дочернему процессу? Например, если родительский канал создает канал, как может дочерний процесс с исключенным доступом знать о концах канала для чтения / записи?

1 Ответ

6 голосов
/ 23 ноября 2011

Просто не устанавливайте флаг O_CLOEXEC open(2) или его соответствующий (и стандартный) флаг FD_CLOEXEC fcntl(2) в дескрипторе - он будет пропущен через exec*() по умолчанию.

Обновление

Спасибо за разъяснения, которые немного меняют ситуацию.

Есть несколько возможностей:

  • Использовать аргументы командной строки: GnuPG в gpg(1) предоставляет ключи командной строки --status-fd, --logger-fd, --attribute-fd, --passphrase-fd, --command-fd для каждого дескриптора файла, который он ожидает получить.Если существует несколько видов данных для отправки или извлечения, это позволяет каждому дескриптору файла сосредоточиться на одном типе данных и уменьшает необходимость разбора более сложного вывода.

  • Просто работайте с файлами ипринимать имена файлов в качестве параметров;когда вы вызываете программу, передайте ей имена файлов, такие как /dev/fd/5, и договоритесь, чтобы ввод был на fd 5 перед вызовом программы:

    cat /dev/fd/5 5</etc/passwd
    
  • Следуйте соглашениям: передайте 0 дочернему элементу в качестве конца чтения канала, 1 в конец записи канала и дайте ему работать как обычная команда фильтра filter конвейера.Это определенно лучший подход, если все входные данные могут быть разумно отправлены через один файловый дескриптор - не всегда желательно.

  • Используйте переменную окружения, чтобы указать файл / socket / fd:

    SSH_AUTH_SOCK=/tmp/ssh-ZriaCoWL2248/agent.2248
    DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-CsUrnHGmKa,guid=e213e2...
    

    Приятно передавать информацию о файле во многие дочерние программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...