2011-11-22 33 views
12

Tôi rơi vào hành vi kỳ lạ này, nơi tôi có chương trình chính và một đứa trẻ được chia đôi. Họ được cấp nước tập trung như thế này (các con số là file descriptor):Giết đứa trẻ bị giết chết cha mẹ?

___parent___ 
|   |      ____child_____ 
| 0 stdin |     |    | 
| 1 pipe1[1]----------.   | 1 stdout | 
| 2 pipe2[1]----------.\   | 2 stderr | 
|____________|   \`----------> 3 pipe1[0] | 
         `----------> 5 pipe2[0] | 
            |______________| 

Vì vậy, cha mẹ được nhập từ stdin nhưng chuyển hướng stdoutstderr đến hai ống. Đứa trẻ đã đóng stdin và sử dụng đầu đọc của ống thay thế.

Sau đó, tôi có một chức năng để chỉ giết con:

void killChild(){ 
    printf("Killing %d\n", (int)childID); 
    fflush(stdout); 
    kill(childID, SIGKILL); 
    waitpid(childID, NULL, 0); // getting rid of the zombie 
} 

Đứa trẻ được thành công giết chết nhưng vấn đề là các mẹ mình bị giết là tốt. Tôi đã kiểm tra PID của đứa trẻ và nó đúng.

Vậy tại sao phụ huynh lại chết?

+5

Tôi thích tên của câu hỏi này. Và nghệ thuật. – Gabe

+3

Phụ huynh nhận được tín hiệu nào? – hochl

+5

Cha mẹ có cố viết thư cho stdout hoặc stderr sau khi giết đứa trẻ không? Nếu vậy, nó chết vì SIGPIPE. Bạn đang thay đổi việc xử lý SIGCHLD? –

Trả lời

13

Bất kỳ nỗ lực nào của phụ huynh để ghi vào fd 1 hoặc fd 2 sau khi thoát khỏi trẻ sẽ dẫn đến hạt nhân gửi SIGPIPE đến cha mẹ. Hành vi mặc định cho SIGPIPE là quá trình chấm dứt. Đó có lẽ là những gì đang xảy ra.

+1

Đó thực sự là vấn đề. Chỉ cần 'close()' ing các đường ống trong bố mẹ đã giải quyết nó. Bây giờ tôi chỉ cần tìm một cách để thiết lập lại stdout và stderr. – Pithikos

+3

@Pithikos dup() stdout/stderr trước khi bạn tạo đường ống. Sau khi bạn đóng các đường ống, dup2() chúng trở lại tập tin mô tả 1/2 một lần nữa. – nos

2

Bạn cần xử lý các tín hiệu SIGPIPESIGCHLD - có thể chỉ bỏ qua chúng - và bạn sẽ ổn.

+2

Và có lẽ đó là một ý tưởng tốt để chờ đợi trẻ em chấm dứt, bạn biết đấy, những thây ma ... – hochl

+1

Anh ấy đã làm điều đó, vì vậy tôi đã không bình luận về điều đó. – pajton

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