Предотвратить fork () от копирования сокетов - PullRequest
5 голосов
/ 05 июля 2010

У меня следующая ситуация (псевдокод):

function f:
    pid = fork()
    if pid == 0:
        exec to another long-running executable (no communication needed to that process)
    else:
        return "something"

f предоставляется через сервер XmlRpc ++ . Когда функция вызывается через XML-RPC, родительский процесс печатает «готово закрытие сокета» после того, как функция вернула «что-то». Но клиент XML-RPC зависает, пока дочерний процесс все еще выполняется. Когда я завершаю дочерний процесс, клиент XML-RPC правильно завершает вызов RPC.

Мне кажется, что у меня проблема с fork() копированием дескрипторов сокетов в дочерний процесс (родительский файл называется closesocket, но дочернему по-прежнему принадлежит ссылка -> соединение все еще установлено). Как я могу обойти это?

РЕДАКТИРОВАТЬ: Я уже читал о FD_CLOEXEC, но я не могу принудительно все дескрипторы, чтобы закрыть на exec?

1 Ответ

5 голосов
/ 05 июля 2010

Нет, вы не можете принудительно закрыть все файловые дескрипторы в exec. Вам нужно будет перебрать все нежелательные файловые дескрипторы в потомке после fork() и закрыть их. К сожалению, не существует простого, переносимого способа сделать это - обычный подход - использовать getrlimit(), чтобы получить текущее значение RLIMIT_NOFILE, и выполнить цикл от 3 до этого числа, пытаясь набрать close() для каждого кандидата.

Если вы счастливы, что можете использовать только Linux, вы можете прочитать каталог /proc/self/fd/, чтобы определить дескрипторы открытых файлов и закрыть их (кроме 0, 1 и 2), которые следует оставить в покое или открыть до /dev/null ).

...