2010-04-25 65 views
5

Vấn đề của tôi không phải là kịch bản tốt nhất cho fork(). Tuy nhiên, đây là func tốt nhất tôi có thể nhận được.fork trong ứng dụng Cocoa

Tôi đang làm việc trên plugin Firefox trên Mac OSX. Để làm cho nó mạnh mẽ, tôi cần tạo một quy trình mới để chạy plugin của mình. Vấn đề là, khi tôi chia hai một quá trình mới, nhiều như thế này:

if (fork() == 0) exit(other_main());

Tuy nhiên, vì nhà nước không được làm sạch, tôi không thể đúng cách khởi tạo tiến trình mới của tôi (gọi NSApplicationLoad vv). Bất kỳ ý tưởng? BTW, tôi chắc chắn không muốn tạo ra một nhị phân mới và thực hiện nó.

Trả lời

3

Nói chung, bạn cần phải exec() sau fork() trên Mac OS X.

Từ trang fork(2) người đàn ông:

Có những hạn chế với những gì bạn có thể làm trong quá trình con. Để hoàn toàn an toàn, bạn nên hạn chế bản thân của mình chỉ thực hiện các hoạt động an toàn không đồng bộ-tín hiệu cho đến khi một trong các hàm exec được gọi. Tất cả các API, bao gồm các biểu tượng dữ liệu toàn cầu, trong bất kỳ khung hoặc thư viện nào được giả định là không an toàn sau một ngã ba() trừ khi được ghi rõ ràng là an toàn hoặc không đồng bộ tín hiệu an toàn. Nếu bạn cần sử dụng các khung công tác này trong tiến trình con, bạn phải thực thi. Trong tình huống này là hợp lý để tự mình thực hiện.

TN2083 cũng bình luận về chủ đề này:

Nhiều khuôn khổ Mac OS X không làm việc đáng tin cậy nếu bạn gọi fork nhưng không gọi exec. Ngoại lệ duy nhất là khuôn khổ hệ thống và thậm chí ở đó, các tiêu chuẩn POSIX đặt những hạn chế nghiêm trọng vào những gì bạn có thể làm giữa một fork và một exec.

QUAN TRỌNG: Trong thực tế, trong Mac OS X 10.5 và sau đó, Core Foundation sẽ phát hiện tình trạng này và in các thông điệp cảnh báo được thể hiện trong Liệt kê 13.

Liệt kê 13: lõi Foundation phàn nàn về ngã ba-không-exec

quá trình này đã chia hai và bạn không thể sử dụng chức năng CoreFoundation này một cách an toàn. Bạn PHẢI exec(). Break on __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__() để gỡ lỗi.

2

ngã ba không có exec về cơ bản hoàn toàn không an toàn trên OSX. Bạn sẽ kết thúc với các cổng mach cũ.

0

Tôi đang viết plugin FreeWRL cho Firefox (Linux tại thời điểm này, Mac & Windows sắp xuất hiện).

http://freewrl.sourceforge.net/

Nó dựa trên ngã ba + exec để khởi động FreeWRL và nuốt cửa sổ của nó vào Firefox.

Bạn sẽ phải sử dụng một ống để xử lý một cách chính xác sự thất bại có thể xảy ra ngã ba + exec hoặc sự thất bại của quá trình con bạn:

How to handle execvp(...) errors after fork()?

Chúc mừng, C

Các vấn đề liên quan