Tôi có tình huống sau đây (giả):Ngăn chặn fork() sao chép ổ cắm
function f:
pid = fork()
if pid == 0:
exec to another long-running executable (no communication needed to that process)
else:
return "something"
f
được tiếp xúc trên một máy chủ XmlRpc++. Khi hàm được gọi qua XML-RPC, tiến trình cha sẽ in ra "done closing socket" sau khi hàm trả về "something". Nhưng máy khách XML-RPC bị treo miễn là tiến trình con vẫn đang chạy. Khi tôi giết quá trình con, trình khách XML-RPC kết thúc chính xác cuộc gọi RPC.
Dường như với tôi rằng tôi đang gặp sự cố với fork()
sao chép mô tả ổ cắm vào tiến trình con (cha mẹ gọi là closesocket
nhưng con vẫn sở hữu tham chiếu -> kết nối vẫn được thiết lập). Làm thế nào tôi có thể phá vỡ điều này?
EDIT: Tôi đọc về FD_CLOEXEC
đã có, nhưng tôi không thể lực tất cả các mô tả được đóng cửa vào exec
?
Hoặc có thể di chuyển và chỉ đặt 'FD_CLOEXEC' trên các mô tả không cần thiết trước' exec (2) '. –
Tôi đã triển khai nó với hệ thống tập tin proc ngay bây giờ, quay trở lại giải pháp 'getrlimit' nếu cần thiết (nếu/proc/self/fd không tồn tại). Chỉ một câu hỏi: Có sự khác biệt giữa 'getrlimit (RLIMIT_NOFILE, ...) - 1' và' sysconf (_SC_OPEN_MAX) 'không? – AndiDog
@Nikolai: Chắc chắn, hoặc chỉ 'close()' chúng - nhưng điều đó giả định rằng bạn * biết * những gì mô tả tập tin được mở, và từ ngữ cảnh nó xuất hiện không phải là trường hợp (vì chúng được mở bởi thứ ba phần mềm -party). – caf