2011-10-23 31 views
5

Tôi có quá trình xử lý chính hai lần và do đó tạo ra hai đứa con. Hai trẻ em được cấp nước tập trung với nhau như thế này:Đứa trẻ cuối cùng được chia đôi sẽ không chết

ls | more 

Bây giờ Vấn đề là đứa con thứ hai không bao giờ chết. Tại sao vậy? Khi nào đứa trẻ cuối cùng trong một đường ống chết thực sự?

Xóa một cuộc gọi chờ() cho biết kết quả mong đợi là ls | more nhưng cung cấp thêm một số hành vi lạ (thiết bị đầu cuối bị kẹt, v.v.).

Đây là mã của tôi:

int main(){ 
    printf("[%d] main\n", getpid()); 
    int pip[2], i; 
    pipe(pip); 

    /* CHILDREN*/ 
    for (i=0; i<2; i++){ 
    if (fork()==0){ 

     /* First child */ 
     if (i==0){ 
     printf("[%d] child1\n", getpid()); 
     close(1); dup(pip[1]); 
     close(pip[0]); 
     execlp("ls", "ls", NULL);} 

     /* Second child */ 
     if (i==1){ 
     printf("[%d] child2\n", getpid()); 
     close(0); dup(pip[0]); 
     close(pip[1]); 
     execlp("more", "more", NULL);} 
    } 
    } 
    wait(NULL); // wait for first child 
    wait(NULL); // wait for second child 
    return 0; 
} 
+1

Tiêu đề của câu hỏi này nghe có vẻ rất bạo lực. – Marlon

+0

@Marlon haha ​​không thấy nó như thế cho đến bây giờ! – Pithikos

Trả lời

6

Các đọc cuối của ống sẽ không nhận được một dấu EOF cho đến khi đầu ghi đã bị đóng bởi tất cả người dùng của nó. Cha mẹ của cả hai trẻ em vẫn có cả hai đầu của đường ống mở, vì vậy more không thấy EOF (trả về 0 từ read()) và tiếp tục chờ thêm dữ liệu đầu vào.

+0

Cảm ơn, điều đó đã làm được! – Pithikos

0

Kiểm tra với ps axw rằng nó thực sự là more mà không chết. Sau đó đọc trang hướng dẫn sử dụng cho wait. Xem trạng thái trả về cho wait.

(Gợi ý: nhìn vào những gì gây ra một quá trình 'zombie' Tôi không nghĩ rằng chờ đợi đang làm những gì bạn nghĩ họ đang có..)

+0

Đã thực hiện điều đó với "ps aux | grep more". Tôi có thể thấy đứa trẻ thứ hai còn sống và dấu nhắc chỉ bị treo (chờ đứa trẻ). – Pithikos

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