Предотвратите ветвление () от копирования сокетов

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

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?

5
задан AndiDog 5 July 2010 в 13:23
поделиться

1 ответ

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

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

5
ответ дан 14 December 2019 в 18:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: