Quá trình cha mẹ mới khi quá trình cha mẹ chết


22

Trong UNIX, khi một tiến trình cha biến mất, tôi nghĩ rằng tất cả các tiến trình con thiết lập lại init là cha mẹ của chúng. Đây có phải là không chính xác tất cả các thời gian? Có bất kỳ ngoại lệ?

Câu trả lời:


5

Chuyển bình luận của tôi thành một câu trả lời .... Tôi không tin có những ngoại lệ.

Tìm thấy điều này "đôi khi quá trình cha mẹ bị giết trước khi con của nó bị giết. Trong trường hợp này, quá trình" cha mẹ của tất cả các quy trình " inittrở thành PPID mới (ID tiến trình cha mẹ). Đôi khi các quá trình này được gọi là quá trình mồ côi." nguồn

Tương tự được mô tả trong blog của IBM : "Cha mẹ chết hoặc bị giết trước đứa trẻ. Trong kịch bản trên, quy trình con trở thành quá trình mồ côi (vì nó đã mất cha mẹ). Trong Linux, initquá trình này giải cứu mồ côi xử lý và nhận nuôi chúng. Điều này có nghĩa là sau khi một đứa trẻ mất cha mẹ, initquá trình này trở thành quá trình cha mẹ mới của nó. "


61

Ba câu trả lời được viết vào năm 2014, tất cả đều nói rằng trong Unices và Linux, quy trình này được sửa lại thành quy trình # 1 mà không có ngoại lệ. Ba câu trả lời sai. ☺

Như SUS nói, được trích dẫn trong một trong những câu trả lời khác ở đây vì vậy tôi sẽ không trích dẫn lại, quy trình cha mẹ của trẻ mồ côi được đặt thành một quy trình xác định theo thực hiện . Cristian Ciupitu có quyền tham khảo tài liệu Linux để xem việc triển khai định nghĩa gì. Nhưng anh ta đang bị đánh lừa bởi tài liệu đó, không phù hợp và không cập nhật.

Hai năm trước khi ba câu trả lời này được viết, và nhanh chóng đến ba năm trước tại thời điểm viết câu trả lời đầu tiên này, nhân Linux đã thay đổi. Các nhà phát triển systemd đã thêm khả năng cho các quy trình tự thiết lập là "các phần tử con". Từ Linux 3.4 trở đi, các quy trình có thể thực hiện prctl()lệnh gọi hệ thống với PR_SET_CHILD_SUBREAPERtùy chọn và kết quả là chúng, chứ không phải quy trình số 1, sẽ trở thành cha mẹ của bất kỳ quy trình hậu duệ mồ côi nào của chúng. Các trang người đàn ông choprctl() là up-to-date, nhưng các trang người đàn ông khác đã không được đưa lên cho đến nay và làm phù hợp.

Trong phiên bản 10.2, FreeBSD có được khả năng tương tự, mở rộng procctl()cuộc gọi hệ thống hiện có PROC_REAP_ACQUIREPROC_REAP_RELEASEcác tùy chọn. Nó đã áp dụng cơ chế này từ DragonFly BSD; đã đạt được nó trong phiên bản 4.2, ban đầu được đặt tên reapctl()nhưng được đổi tên trong quá trình phát triển thành procctl().

Vì vậy, có những trường hợp ngoại lệ và những trường hợp khá nổi bật: Trên Linux, FreeBSD / PC-BSD và DragonFly BSD, quy trình cha mẹ của những đứa trẻ mồ côi được đặt theo quy trình tổ tiên gần nhất của đứa trẻ được đánh dấu là một trường hợp con hoặc quá trình # 1 nếu không có quá trình phụ tổ tiên. Các tiện ích giám sát daemon khác nhau - bao gồm systemd (ứng dụng mà các nhà phát triển đã đưa nó vào kernel Linux ngay từ đầu), mới bắt đầu và nosh service-manager- đã sử dụng điều này.

Nếu như daemon giám sát không được xử lý # 1, và nó sinh ra một dịch vụ như một phiên đăng nhập tương tác, và trong đó một phiên làm việc (khá wrongheaded) trick của cố gắng "daemonize" bởi đôi fork()ing , sau đó quá trình của một người sẽ cuối cùng là con của người giám sát daemon, không phải là quá trình # 1. Tất nhiên, việc mong đợi có thể sinh ra daemon từ bên trong các phiên đăng nhập là một sai lầm cơ bản. Nhưng đó là một câu trả lời khác.

đọc thêm


Tôi thực sự đã nhận thấy các quá trình mồ côi được gắn vào một phiên init (trên Ubuntu với Upstart), nhưng không bao giờ nhận ra tầm quan trọng của nó. +1
muru

Xem unix.stackexchange.com/a/194208/5132 để biết thêm về khởi động phiên init, cụ thể.
JdeBP

8

Theo exittrang hướng dẫn từ Đặc tả UNIX® đơn, Phiên bản 2:

ID tiến trình cha của tất cả các quy trình con và quy trình zombie hiện có của quy trình gọi được đặt thành ID quy trình của quy trình hệ thống phụ thuộc vào triển khai. Đó là, các quy trình này được kế thừa bởi một quy trình hệ thống đặc biệt.

Đối với hầu hết các biến thể Unix, quy trình đặc biệt đó là init(PID 1).

wait(2)Trang người đàn ông Linux xác nhận điều này:

Nếu một quá trình cha mẹ chấm dứt, thì những đứa trẻ "zombie" của nó (nếu có) được thông qua bởi init (8), nó sẽ tự động thực hiện chờ đợi để loại bỏ zombie.

Các trang man FreeBSD wait(2), NetBSD wait(2), OpenBSD wait(2)và Mac OS X cũng wait(2)xác nhận điều này:

Nếu một tiến trình cha kết thúc mà không đợi tất cả các tiến trình con của nó kết thúc, các tiến trình con còn lại được gán cho ID tiến trình cha mẹ 1 (ID tiến trình init).

wait(3C)Trang con người Oracle Solaris 11.1 cũng xác nhận điều này:

Nếu một tiến trình cha kết thúc mà không đợi các tiến trình con của nó kết thúc, ID tiến trình cha của mỗi tiến trình con được đặt thành 1, với quá trình khởi tạo kế thừa các tiến trình con; thấy Intro(2).


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.