2010-04-07 46 views
5

Tôi đang cố gắng tìm ra pid là một quá trình gửi tín hiệu SIGCHLD và tôi muốn thực hiện điều này trong trình xử lý tín hiệu mà tôi đã tạo cho SIGCHLD. Làm thế nào tôi sẽ làm điều này? Tôi đang cố gắng:Xác định pid của quá trình chấm dứt

int pid = waitpid(-1, NULL, WNOHANG); 

vì tôi muốn đợi cho bất kỳ quá trình con nào được sinh ra.

+0

Cách tiếp cận của bạn là chính xác, nó sẽ hoạt động. Câu hỏi của bạn là gì? – qrdl

+0

Tôi làm cách nào để nhận được pid của quá trình gửi SIGCHLD? – Hristo

+2

'waitpid()' trả về pid của con bị chấm dứt, nếu bạn gọi nó từ trình xử lý tín hiệu của bạn. – qrdl

Trả lời

7

Nếu bạn sử dụng waitpid() nhiều hơn hoặc ít hơn như được hiển thị, bạn sẽ được thông báo về PID của một trong các quy trình con đã chết - thường sẽ là quá trình duy nhất đã chết, nhưng nếu bạn nhận được sự cố, bạn có thể nhận được một tín hiệu và nhiều xác chết để thu thập. Vì vậy, sử dụng:

void sigchld_handler(int signum) 
{ 
    pid_t pid; 
    int status; 
    while ((pid = waitpid(-1, &status, WNOHANG)) != -1) 
    { 
     unregister_child(pid, status); // Or whatever you need to do with the PID 
    } 
} 

Bạn có thể thay &status với NULL nếu bạn không quan tâm đến trạng thái thoát của đứa trẻ.

Các vấn đề liên quan