2009-10-29 24 views
7

Khi tôi chờ một nhóm quy trình đang chạy cụ thể là tiến trình con, WIFEXITED trả về đúng là quá trình đã thoát? Đây có phải là cách nó hoạt động không? Dường như có cái gì đó tôi không hiểu ....Tại sao WIFEXITED trả về đúng trên quy trình chạy?

if (waitpid(-pgid, &pstatus, WUNTRACED|WNOHANG) == -1) 
    perror("Wait error"); 

if (WIFEXITED(pstatus)) { 
    strncpy(buf, "Exited", buf_size); 
    return 0; 

Trả lời

6

Như bạn đã xác định WNOHANG Tôi nghĩ waitpid đang trở lại 0pstatus đã giá trị nó đã có trước nên WIFEXITED không hoạt động với dữ liệu được cập nhật.

nếu WNOHANG đã được chỉ định và một hoặc nhiều con (em) theo quy định của pid tồn tại, nhưng chưa thay đổi trạng thái, sau đó 0 được trả về.

+0

Ah, tôi đã làm reinitialize 0, nhưng bây giờ tôi loại hiểu. nhưng tôi không hoàn toàn hiểu làm thế nào để nói nếu một cái gì đó vẫn còn chạy hoặc nếu nó đã thoát (mà không bị chặn). –

+0

Nếu bất kỳ trẻ nào của bạn thay đổi trạng thái (đã chết), waitpid sẽ trả về một số dương. –

+0

Ồ tôi hiểu ngay bây giờ ... Tôi cần lấy cả giá trị trả lại và giá trị trạng thái để có được trạng thái của quá trình. (Giá trị trả về không chỉ là do lỗi hay không). Cảm ơn bạn! –

1

waitpid trả về pid con bị gặt nếu nó gặt hái thành công một đứa trẻ. Khi được sử dụng với WNOHANG, nó ngay lập tức trả về 0 nếu không có trẻ em nào đã thoát. Vì vậy, bạn cần phải kiểm tra xem giá trị trả về là 0 hay pid trước khi bạn kiểm tra status. Xem ở đây để biết chi tiết:

http://pubs.opengroup.org/onlinepubs/9699919799/functions/waitpid.html

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