Tôi đã nghiên cứu hành vi nhân Linux khá lâu rồi và tôi luôn thấy rõ rằng:
Khi một quá trình chết, tất cả các con của nó được đưa trở lại
init
quy trình (PID 1) cho đến khi cuối cùng chúng chết.
Tuy nhiên, gần đây, một người có nhiều kinh nghiệm hơn tôi với kernel đã nói với tôi rằng:
Khi một quá trình thoát ra, tất cả các con của nó cũng chết (trừ khi bạn sử dụng
NOHUP
trong trường hợp chúng quay lạiinit
).
Bây giờ, mặc dù tôi không tin điều này, tôi vẫn viết một chương trình đơn giản để đảm bảo về nó. Tôi biết tôi không nên dựa vào thời gian ( sleep
) cho các bài kiểm tra vì tất cả phụ thuộc vào lập lịch xử lý, nhưng đối với trường hợp đơn giản này, tôi nghĩ rằng điều đó là khá đủ.
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;
}
Đây là đầu ra của chương trình, với kết ps
quả được liên kết mỗi lần printf
nói chuyện:
$ ./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).
Bây giờ, như bạn có thể thấy, điều này hoạt động hoàn toàn như tôi mong đợi. Quá trình mồ côi (436) được đưa trở lại init
(1) cho đến khi nó chết.
Tuy nhiên, có bất kỳ hệ thống dựa trên UNIX nào mà hành vi này không áp dụng theo mặc định không? Có hệ thống nào mà cái chết của một quá trình ngay lập tức kích hoạt cái chết của tất cả trẻ em của nó không?