2010-07-05 39 views
5

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?

Trả lời

5

Không, bạn không thể buộc tất cả các trình mô tả tệp phải đóng trên exec. Bạn sẽ cần phải lặp lại tất cả các mô tả tệp không mong muốn ở trẻ sau fork() và đóng chúng lại. Thật không may, không có cách dễ dàng, di động, để làm điều đó - cách tiếp cận thông thường là sử dụng getrlimit() để lấy giá trị hiện tại là RLIMIT_NOFILE và lặp từ 3 đến số đó, thử close() trên mỗi ứng cử viên.

Nếu bạn hạnh phúc chỉ sử dụng Linux, bạn có thể đọc thư mục /proc/self/fd/ để xác định các mô tả tệp mở và đóng chúng (trừ 0, 1 và 2 - phải được để riêng hoặc mở lại thành /dev/null).

+2

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) '. –

+0

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

+0

@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