Есть ли способ автоматически закрывать определенные дескрипторы на fork ()? - PullRequest
4 голосов
/ 01 апреля 2011

Предыстория: у меня большой существующий процесс (он происходит в AIX, так что в основном это семантика POSIX), который является частью еще большей системы.Существующие процессы предназначены для непрерывной работы.Новым требованием для этого процесса является обработка нового вида сложного входного потока.Чтобы снизить риск, я решил запустить / выполнить дочерний процесс, чтобы выполнить фактическую обработку ввода, которая изолирует существующий основной процесс от таких проблем, как сбои или зависания искаженных входных данных.

Дочерний процессПроцесс читает данные из стандартного ввода и записывает в стандартный вывод после обработки.У меня настроены все каналы связи, так что я могу передавать входные данные из основного процесса дочернему элементу и читать выходные данные другим способом, все работает нормально (неблокирование, чтобы избежать взаимоблокировок и т. Д.).Дочерний процесс живет столько времени, сколько требуется для основного процесса для получения (конечного) входного потока от внешнего источника.

У меня вопрос о самих каналах.Основной процесс сообщает дочернему элементу, что поток ввода завершен, вызывая close() в канале, подключенном к стандартному дочернему элементу.Это работает до тех пор, пока основной процесс удерживает дескриптор only до конца записи этого канала.Что, если основной процесс, по какой-то другой не связанной причине, решит раскошелиться?Затем это создаст две ручки для конца записи канала, то есть, когда я пытаюсь закрыть конец записи канала stdin, дочерний элемент не заметит, потому что есть еще одна ручка для конца записиоткрыть.Этот другой открытый дескриптор находится вне моего контроля.

Я знаю, что есть бит FD_CLOEXEC, который я могу установить в файловом дескрипторе, чтобы он автоматически закрывался, когда exec() завершается.Однако это не защитит от случая, когда основной процесс разветвляется, но не исполняется.

Каково общее решение этой проблемы?Я могу придумать только пару идей:

  1. Убедитесь (посредством проверки), что существующий процесс не будет произвольно разветвляться без выполнения exec.Это может быть возможно, но не является общим решением.
  2. При запуске разветвляется долгоживущий вспомогательный процесс, единственной обязанностью которого является периодическое разветвление / выполнение дочернего процесса, выполняющего фактическую обработку.Таким образом, контекст дескриптора помощника известен и может хорошо контролироваться.Однако это раздражает, потому что помощнику нужен какой-то способ узнать, что поток ввода закончился, кроме закрытия его стандартного ввода.

1 Ответ

2 голосов
/ 01 апреля 2011

Очень мало Нет стандартных системных библиотек fork без exec. Это довольно необычно. В Unix или Linux нет возможности "закрыться", и я сомневаюсь в этом в AIX. В AIX есть загружаемые расширения ядра, если вас это действительно волнует. Предположительно, вы знаете о fcntl для закрытия на exec. Если ваши коллеги пишут вилки без exec, то я не могу предложить большую помощь.

...