我有以下的情況(僞代碼):防止叉()從複製插座
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調用時,父進程在函數返回「something」後打印「done closing socket」。但是,只要子進程仍在運行,XML-RPC客戶端就會掛起。當我終止子進程時,XML-RPC客戶端正確地完成RPC調用。
在我看來,我在fork()
將子套接字描述符複製到子進程(父進程名爲closesocket
,但子進程仍然擁有引用 - >連接仍然建立)時出現問題。我怎樣才能繞過這個?
編輯:我讀到FD_CLOEXEC
了,但我不能力所有描述要在exec
關閉?
或者是可移植的,只需在'exec(2)'之前不需要的描述符上設置'FD_CLOEXEC'。 – 2010-07-05 15:36:15
我現在用proc文件系統實現了它,如果需要的話(如果/ proc/self/fd不存在),可以回到'getrlimit'解決方案。只有一個問題:getrlimit(RLIMIT_NOFILE,...) - 1'和'sysconf(_SC_OPEN_MAX)'有區別嗎? – AndiDog 2010-07-05 16:14:47
@Nikolai:當然,或者只是'close()'它們 - 但是假設你知道哪些文件描述符是打開的,並且從上下文看起來並非如此(因爲它們被第三個第四方軟件)。 – caf 2010-07-05 23:45:08