У меня есть следующая ситуация (псевдокод):
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
?
Нет, вы не можете принудительно закрыть все файловые дескрипторы при выполнении. Вам нужно будет перебрать все нежелательные файловые дескрипторы в дочернем элементе после fork ()
и закрыть их. К сожалению, нет простого портативного способа сделать это - обычный подход заключается в использовании getrlimit ()
для получения текущего значения RLIMIT_NOFILE
и цикла от 3 до этого. number, пробуя close ()
для каждого кандидата.
Если вам нравится работать только с Linux, вы можете прочитать каталог / proc / self / fd /
, чтобы определить дескрипторы открытых файлов и закрыть их (кроме 0, 1 и 2 - которые должны либо оставить в покое, либо снова открыть в / dev / null
).