Tôi đã hiểu rằng: 1) waitpid được sử dụng để chờ đợi cái chết của đứa trẻ và sau đó thu thập SIGCHLD và trạng thái thoát của đứa trẻ, vv .. 2) Khi chúng tôi có bộ xử lý tín hiệu cho SIGCHLD, chúng tôi thực hiện thêm một số thứ liên quan đến dọn dẹp của trẻ em hoặc các công cụ khác (tối đa lập trình viên) và sau đó làm một waitpid để đứa trẻ sẽ không đi zombie và sau đó trở về.Sử dụng waitpid hoặc sigaction?
Bây giờ, chúng ta có cần phải có cả 1 và 2 trong các chương trình của mình khi chúng tôi thực hiện một ngã ba/exec và đứa trẻ quay trở lại? Nếu chúng ta có cả hai, các SIGCHLD thu được đầu tiên, vì vậy xử lý tín hiệu được gọi là đầu tiên và do đó waitpid của nó được gọi là thành công và không phải là waitpid trong mã trình cha mẹ như sau:
my_signal_handler_for_sigchld
{
do something
tmp = waitpid(-1,NULL,0);
print tmp (which is the correct value of the child pid)
}
int main()
{
sigaction(SIGCHLD, my_signal_handler_for_sigchld)
fork()
if (child) //do something, return
if parent // waitpid(child_pid, NULL,0); print value returned from this waitpid - it is -1
}
Đánh giá cao nếu ai đó giúp tôi hiểu điều này.
Xin chào, Cảm ơn câu trả lời của bạn.Nhưng những gì tôi đã thực sự tìm kiếm là: Khi tôi có cả sig_handler và waitpid trong tiến trình cha, sig_handler được gọi là becaues của sigchld và sau đó waitpid thứ 2 như được hiển thị ở trên trong câu trả về của tôi -1. Vì vậy, tôi có thể chỉ cần loại bỏ waitpid thứ 2 mà tôi đang có? – Vin
Có, bạn chỉ có thể chờ đợi thành công một quá trình cho trẻ em một lần. Nó thực sự là một lỗi để chờ đợi một lần nữa kể từ khi pid là "giải phóng" bởi sự chờ đợi đầu tiên và có thể đã được tái sử dụng cho một quá trình con mới (nếu bạn xảy ra để tạo ra một số khác). –
@R .. Chúng tôi có thể làm rõ 'Khi quá trình con chấm dứt, kết thúc của đường ống sẽ được đóng lại một chút? Để thực sự chính xác, nó sẽ không được 'Khi quá trình con đóng FD của nó mà là một kết nối với đầu ống, và không có quá trình khác có FDs kết nối với đầu ống, sau đó đầu kia của đường ống sẽ được báo hiệu là đóng (nhận EOF) '? Tôi tin rằng điều đó sẽ giải thích chính xác hơn những gì xảy ra, và cũng là trường hợp đặc biệt quan trọng của những gì sẽ xảy ra nếu có hơn 2 quy trình có FDs cho một đường ống mở. – nh2