Zombie không thực sự liên quan đến những người khác; nó chỉ đơn giản là một quá trình đã kết thúc, nhưng quá trình cha của nó vẫn chưa đọc trạng thái thoát của nó với waitpid()
hoặc tương tự. Bạn không nên nhìn thấy những thứ này trừ khi một quá trình bị lỗi hoặc dừng lại.
Một daemon là một chương trình chạy mà không có thiết bị đầu cuối kiểm soát. Thông thường, khi bạn chạy chương trình, fork()s
chính nó và cha mẹ thoát ra để shell nghĩ rằng lệnh đã kết thúc và tiến trình con tách khỏi thiết bị đầu cuối và thoát khỏi phiên đăng nhập. Vì tiến trình mẹ của nó đã thoát, ID tiến trình cha của nó trở thành 1, theo truyền thống là init
chương trình, hoặc những ngày này , systemd
. Quá trình này đảm bảo gặt hái những đứa con của nó khi chúng chết để bạn không bị thây ma tấn công.
Một quá trình có thể được liên kết với một thiết bị đầu cuối kiểm soát , đó là nơi nó thường lấy đầu vào từ đó và gửi đầu ra của nó đến. Thiết bị đầu cuối cũng có thể gửi tín hiệu đến các quy trình được đính kèm và xác định một nhóm quy trình là nhóm tiền cảnh . Các quy trình trong nhóm tiền cảnh được phép đọc đầu vào từ thiết bị đầu cuối và được gửi tín hiệu SIGINT và SIGSUSP khi bạn nhấn Ctrl-C và Ctrl-Z. Bất kỳ quá trình nào không nằm trong nhóm tiền cảnh cố đọc từ thiết bị đầu cuối đều bị treo với SIGTSTP.
Shell tạo các nhóm quy trình khác nhau cho mỗi lệnh đường ống mà bạn yêu cầu nó chạy và thay đổi nhóm nào là nhóm tiền cảnh để di chuyển các công việc giữa nền trước và nền. Khi bạn chạy một lệnh, thông thường shell sẽ tạo một nhóm quy trình mới và biến nhóm đó thành nhóm tiền cảnh . Nếu bạn hậu tố nó với một &
cái vỏ thì chỉ cần rời khỏi nhóm tiền cảnh nơi nó đã ở và vì vậy nhóm mới ở trong nền. Nhấn Ctrl-Z sẽ gửi SIGSUSP đến nhóm tiền cảnh, điều này khiến hầu hết các lệnh bị tạm dừng, nhưng thay vì tạm dừng, trình bao thay đổi nhóm tiền cảnh hoạt động trở lại chính nó để nó có thể nhắc bạn một lệnh mới.
Các bg
lệnh gửi SIGCONT cho một nhóm quá trình để nó có thể tiếp tục chạy ở chế độ nền sau khi đã bị đình chỉ với SIGSUSP. fg
thay đổi nhóm tiền cảnh thành một trong các nhóm hiện có đang chạy trong nền, đưa nó lên nền trước.
fork()
tắt một bản sao của chính bạn, sử dụngexec()
trong bản sao đó để thay thế nó bằng những gì bạn muốn chạy và sử dụngwait()
trong trường hợp ban đầu của chương trình (không phải bản sao đã chạyexec()
). Trong khoảng thời gian rất, rất ngắn giữa khi đứa trẻ thoát ra và khiwait()
gặt hái trạng thái thoát đó (xóa nó khỏi bảng quy trình và trả lại cho người gọi), bạn có một zombie.