ฉันได้ศึกษาพฤติกรรมเคอร์เนลของ Linux มาระยะหนึ่งแล้วและมันชัดเจนสำหรับฉันเสมอว่า:
เมื่อกระบวนการตายเด็กทุกคนจะถูกส่งกลับไปที่
init
กระบวนการ (PID 1) จนกว่าพวกเขาจะตายในที่สุด
อย่างไรก็ตามเมื่อเร็ว ๆ นี้มีคนที่มีประสบการณ์มากกว่าฉันด้วยเคอร์เนลบอกฉันว่า:
เมื่อกระบวนการออกไปเด็กทุกคนในนั้นก็ตาย (ยกเว้นคุณใช้
NOHUP
ในกรณีที่พวกเขากลับไปinit
)
ตอนนี้แม้ว่าฉันจะไม่เชื่อเรื่องนี้ฉันยังคงเขียนโปรแกรมง่าย ๆ เพื่อให้แน่ใจ ฉันรู้ว่าฉันไม่ควรพึ่งพาเวลา ( sleep
) สำหรับการทดสอบเนื่องจากทุกอย่างขึ้นอยู่กับการจัดตารางกระบวนการ แต่สำหรับกรณีง่าย ๆ นี้ฉันคิดว่ามันค่อนข้างเพียงพอ
int main(void){
printf("Father process spawned (%d).\n", getpid());
sleep(5);
if(fork() == 0){
printf("Child process spawned (%d => %d).\n", getppid(), getpid());
sleep(15);
printf("Child process exiting (%d => %d).\n", getppid(), getpid());
exit(0);
}
sleep(5);
printf(stdout, "Father process exiting (%d).\n", getpid());
return EXIT_SUCCESS;
}
นี่คือผลลัพธ์ของโปรแกรมพร้อมps
ผลลัพธ์ที่เกี่ยวข้องทุกครั้งที่printf
พูดถึง:
$ ./test &
Father process spawned (435).
$ ps -ef | grep test
myuser 435 392 tty1 ./test
Child process spawned (435 => 436).
$ ps -ef | grep test
myuser 435 392 tty1 ./test
myuser 436 435 tty1 ./test
Father process exiting (435).
$ ps -ef | grep test
myuser 436 1 tty1 ./test
Child process exiting (436).
ทีนี้อย่างที่คุณเห็นสิ่งนี้มีพฤติกรรมเหมือนที่ฉันคาดไว้ กระบวนการเด็กกำพร้า (436) จะได้รับกลับไปที่init
(1) จนกว่ามันจะตาย
อย่างไรก็ตามมีระบบที่ใช้ UNIX ซึ่งพฤติกรรมนี้ไม่ได้ใช้งานโดยค่าเริ่มต้นหรือไม่? มีระบบใดบ้างที่การตายของกระบวนการทำให้เกิดการตายของลูกทั้งหมด?