Từ "subreaper" được sử dụng trong một số câu trả lời. Tìm kiếm Google cũng xuất hiện các mục trong đó từ "chỉ được sử dụng".
Làm thế nào tôi có thể hiểu "tiểu đơn vị" là gì?
Từ "subreaper" được sử dụng trong một số câu trả lời. Tìm kiếm Google cũng xuất hiện các mục trong đó từ "chỉ được sử dụng".
Làm thế nào tôi có thể hiểu "tiểu đơn vị" là gì?
Câu trả lời:
Điều này đã được triển khai cho nhân Linux 3,4 như một cờ của hệ thống gọi prctl () .
Từ prctl(2)
trang hướng dẫn:
[...] Một người con hoàn thành vai trò của
init(1)
các quá trình hậu duệ của nó. Sau khi chấm dứt một quá trình mồ côi (tức là cha mẹ ngay lập tức của nó đã chấm dứt) và được đánh dấu là có một người con, người con tổ tiên còn sống gần nhất sẽ nhận đượcSIGCHLD
tín hiệu và có thểwait(2)
vào quá trình để phát hiện ra tình trạng chấm dứt của nó.
Một quá trình có thể định nghĩa chính nó như là một subreaper với prctl(PR_SET_CHILD_SUBREAPER)
. Nếu vậy, không phải init
(PID 1) sẽ trở thành cha mẹ của các quá trình con mồ côi , thay vào đó, ông bà sống gần nhất được đánh dấu là một người con sẽ trở thành cha mẹ mới. Nếu không có ông bà sống thì init
không.
Lý do để thực hiện cơ chế này là các nhà quản lý / giám sát dịch vụ không gian người dùng (như upstart
, systemd
) cần theo dõi các dịch vụ đã bắt đầu của họ. Nhiều dịch vụ được kích hoạt bằng cách tách đôi và được cấp lại hoàn toàn cho PID 1. Người quản lý dịch vụ sẽ không còn có thể nhận được SIGCHLD
tín hiệu cho họ và không còn chịu trách nhiệm gặt hái cho trẻ em wait()
. Tất cả thông tin về trẻ em bị mất tại thời điểm PID 1 dọn sạch các quy trình được cấp phép lại. Bây giờ, một quy trình quản lý dịch vụ có thể tự đánh dấu là một loại "tiểu khởi động" và giờ đây có thể trở thành cha mẹ cho tất cả các quy trình mồ côi được tạo bởi các dịch vụ bắt đầu. Tất cả các SIGCHLD
tín hiệu sẽ được gửi đến người quản lý dịch vụ.
Trong Linux, một daemon thường được tạo bằng cách tách hai lần với quá trình trung gian thoát ra sau khi bỏ cháu. Đây là một kỹ thuật phổ biến để tránh các quá trình zombie . Kịch bản init gọi một đứa trẻ. Đứa trẻ đó lại một lần nữa và do đó thoát ra ngay lập tức. Đứa cháu sẽ được nhận nuôi init
, nó liên tục kêu gọi wait()
thu thập trạng thái thoát ra của con mình để tránh zombie. Với khái niệm về các đối tượng con, trình quản lý dịch vụ không gian người dùng giờ đây trở thành cha mẹ mới, thay vì init
.