2013-10-19 36 views
29

Tôi hy vọng một người nào đó có thể làm sáng tỏ cách để cha mẹ đợi cho TẤT CẢ các tiến trình con hoàn thành trước khi tiếp tục sau ngã ba. Tôi có mã dọn dẹp mà tôi muốn chạy nhưng các tiến trình con cần phải trả lại trước khi điều này có thể xảy ra.Làm cha mẹ chờ tất cả các quy trình con

for (int id=0; id<n; id++) { 
    if (fork()==0) { 
    // Child 
    exit(0);  
    } else { 
    // Parent 
    ... 
    } 
    ... 
} 
+2

Bạn sẽ tìm thấy PID trở về từ tất cả những dĩa đặc biệt hữu ích trong công việc của bạn nếu bạn quan tâm mà con đã thoát và khi nào. Nếu không, 'wait()' cho 'n' lần. – WhozCraig

Trả lời

24

POSIX định nghĩa hàm: wait(NULL);. Đó là viết tắt của waitpid(-1, NULL, 0);, thao tác này sẽ tạm dừng quá trình thực hiện quy trình gọi cho đến khi bất kỳ quá trình nào của một đứa trẻ thoát. Ở đây, đối số thứ nhất của waitpid cho biết sẽ đợi cho bất kỳ quá trình con nào kết thúc.

Trong trường hợp của bạn, hãy để cha mẹ gọi điện thoại từ chi nhánh else của bạn.

+0

Cảm ơn bạn đã trả lời ur. Tôi được thêm vào trong chờ đợi (NULL) vào phần không con, và chương trình chỉ bị treo và các tiến trình con thậm chí không thực hiện ?? – Donatello

+1

OH, Đó không phải lỗi do wait(). Bạn nên đặt mã hoàn chỉnh của mình để cho phép tôi gỡ lỗi. Mã của bạn quá đơn giản, chỉ là một mô hình. – longdeqidao

+7

Trang manpage cho 'wait' nói rằng nó chờ đợi ** một ** số trẻ em chấm dứt. Như @WhozCraig đã đề cập ở trên, bạn cần phải "chờ đợi" cho 'n' lần. –

19

Sử dụng waitpid() như thế này:

pid_t childPid; // the child process that the execution will soon run inside of. 
childPid = fork(); 

if(childPid == 0) // fork succeeded 
{ 
    // Do something 
    exit(0); 
} 

else if(childPid < 0) // fork failed 
{  
    // log the error 
} 

else // Main (parent) process after fork succeeds 
{  
    int returnStatus;  
    waitpid(childPid, &returnStatus, 0); // Parent process waits here for child to terminate. 

    if (returnStatus == 0) // Verify child process terminated without error. 
    { 
     printf("The child process terminated normally.");  
    } 

    if (returnStatus == 1)  
    { 
     printf("The child process terminated with an error!.");  
    } 
} 
+2

Điều đó không chờ đợi cho tất cả trẻ em hoàn thành chỉ một childPid con. Nếu có nhiều quy trình hơn thì điều này sẽ không hiệu quả. – JH95

+1

Tất nhiên nếu bạn tạo nhiều hơn một luồng từ một tiến trình cha, bạn sẽ phải sửa đổi ví dụ này cho phù hợp. Cung cấp một ví dụ với một số dĩa sẽ làm cho câu trả lời của tôi trông khó hiểu. –

+1

Bạn sẽ sửa đổi mã này cho phụ huynh như thế nào để chờ TẤT CẢ trẻ em kết thúc? – OutFall

27
pid_t child_pid, wpid; 
int status = 0; 

//Father code (before child processes start) 

for (int id=0; id<n; id++) { 
    if ((child_pid = fork()) == 0) { 
     //child code 
     exit(0); 
    } 
} 

while ((wpid = wait(&status)) > 0); // this way, the father waits for all the child processes 

//Father code (After all child processes end) 
+1

Rất hữu ích. Cảm ơn! –

+0

Snipet này chỉ làm việc cho tôi ... THANKS. – PMateus

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