Nói một cách chính xác, nĩa đôi không liên quan gì đến việc nuôi dạy lại con daemon khi còn nhỏ init
. Tất cả những gì cần thiết để nuôi dạy lại đứa trẻ là cha mẹ phải thoát ra. Điều này có thể được thực hiện chỉ với một ngã ba duy nhất. Ngoài ra, thực hiện một ngã ba đôi tự nó không tái định nghĩa quá trình trình nền init
; cha của daemon phải thoát ra. Nói cách khác, cha mẹ luôn thoát ra khi tạo một daemon thích hợp để quá trình daemon được phát hiện lại init
.
Vậy tại sao ngã ba đôi? POSIX.1-2008 Mục 11.1.3, " Thiết bị đầu cuối kiểm soát ", có câu trả lời (nhấn mạnh thêm):
Thiết bị đầu cuối kiểm soát cho một phiên được phân bổ bởi người lãnh đạo phiên theo cách xác định thực hiện. Nếu một nhà lãnh đạo phiên không có thiết bị đầu cuối kiểm soát và mở tệp thiết bị đầu cuối chưa được liên kết với phiên mà không sử dụng O_NOCTTY
tùy chọn (xem open()
), thì nó được xác định theo thực thi liệu thiết bị đầu cuối có trở thành thiết bị đầu cuối kiểm soát của nhà lãnh đạo phiên hay không. Nếu một quá trình đó là không một nhà lãnh đạo phiên mở một tập tin thiết bị đầu cuối, hoặc các O_NOCTTY
tùy chọn được sử dụng trên open()
, sau đó thiết bị đầu cuối sẽ không trở thành thiết bị đầu cuối kiểm soát của quá trình gọi .
Điều này cho chúng ta biết rằng nếu một quy trình daemon làm điều gì đó như thế này ...
int fd = open("/dev/console", O_RDWR);
... Sau đó, quy trình trình nền có thể có được /dev/console
như là thiết bị đầu cuối kiểm soát của nó, tùy thuộc vào việc quy trình trình nền có phải là người dẫn đầu phiên hay không và tùy thuộc vào việc triển khai hệ thống. Chương trình có thể đảm bảo rằng cuộc gọi trên sẽ không có được thiết bị đầu cuối kiểm soát nếu trước tiên chương trình đảm bảo rằng đó không phải là người dẫn đầu phiên.
Thông thường, khi khởi chạy một daemon, setsid
được gọi (từ tiến trình con sau khi gọi fork
) để phân tách daemon khỏi thiết bị đầu cuối kiểm soát của nó. Tuy nhiên, gọi setsid
cũng có nghĩa là quá trình gọi sẽ là người lãnh đạo phiên của phiên mới, điều này mở ra khả năng daemon có thể yêu cầu thiết bị đầu cuối kiểm soát. Kỹ thuật fork đôi đảm bảo rằng quy trình daemon không phải là người dẫn đầu phiên, sau đó đảm bảo rằng một cuộc gọi đến open
, như trong ví dụ trên, sẽ không dẫn đến quá trình daemon lấy lại thiết bị đầu cuối điều khiển.
Kỹ thuật double-fork là một chút hoang tưởng. Có thể không cần thiết nếu bạn biết rằng trình nền sẽ không bao giờ mở tệp thiết bị đầu cuối. Ngoài ra, trên một số hệ thống, có thể không cần thiết ngay cả khi daemon mở tệp thiết bị đầu cuối, vì hành vi đó được xác định theo thực thi. Tuy nhiên, một điều không được xác định theo triển khai là chỉ có người lãnh đạo phiên có thể phân bổ thiết bị đầu cuối kiểm soát. Nếu một quá trình không phải là một nhà lãnh đạo phiên, nó không thể phân bổ một thiết bị đầu cuối kiểm soát. Do đó, nếu bạn muốn bị hoang tưởng và chắc chắn rằng quy trình daemon không thể vô tình có được một thiết bị đầu cuối kiểm soát, bất kể mọi chi tiết cụ thể do triển khai thực hiện, thì kỹ thuật hai ngã ba là rất cần thiết.