2013-10-01 13 views
11

Tôi tin rằng điều này tạo ra 24 quy trình; tuy nhiên, tôi cần xác minh. Những câu hỏi này thường khiến tôi khó chịu. Cảm ơn đã giúp đỡ!Có bao nhiêu tiến trình được tạo bằng các câu lệnh fork() này?

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int main(void) 
{ 
    pid_t pid = fork(); 
    pid = fork(); 
    pid = fork(); 
    if (pid == 0) 
    { 
    fork(); 
    } 
    fork(); 
    return 0; 
} 
+2

Đặt printf vào đó, sau đó biên dịch và chạy nó, và bạn sẽ thấy. –

Trả lời

22

Khá dễ dàng để lý do thông qua việc này. Cuộc gọi fork tạo ra một quy trình bổ sung mỗi lần thực thi. Cuộc gọi trả về 0 trong quy trình mới (con) và id tiến trình của con (không phải số không) trong quy trình gốc (phụ huynh).

pid_t pid = fork(); // fork #1 
pid = fork();  // fork #2 
pid = fork();  // fork #3 
if (pid == 0) 
{ 
    fork();   // fork #4 
} 
fork();    // fork #5 
  1. Fork # 1 tạo thêm quy trình. Bây giờ bạn có hai quy trình.
  2. Ngã ba số 2 được thực hiện bởi hai quy trình, tạo hai quy trình, với tổng số là bốn.
  3. Ngã ba số 3 được thực hiện theo bốn quy trình, tạo bốn quy trình, với tổng số là tám quy trình. Một nửa trong số đó có pid==0 và một nửa có pid != 0
  4. Ngã ba số 4 được thực hiện bằng một nửa các quy trình được tạo bởi ngã ba # 3 (vì vậy, bốn trong số đó). Điều này tạo ra bốn quy trình bổ sung. Bây giờ bạn có mười hai quy trình.
  5. Ngã ba # 5 được thực hiện bởi tất cả mười hai trong số các quy trình còn lại, tạo thêm mười hai quy trình; bây giờ bạn có hai mươi bốn.
+7

'fork()' cũng có thể không trả về '-1', vì vậy bạn có thể nói rằng có 'không nhiều hơn' 24 quy trình, không 'chính xác' 24. – mbaitoff

+2

tuyệt vời: D, bạn nên là giáo viên. – roottraveller

1

Bạn là chính xác. It's 24. Chỉ cần biên dịch và chạy nó w/printf trước khi tuyên bố trở lại cuối cùng. Có 24 dòng đầu ra.

2

Tính theo cách này:

Bắt đầu với 1 (Process chính) và cho tất cả các ngã ba làm cho nó hai lần nếu ngã ba không phải là bên trong if (pid == 0) khác thêm 1/2 của hiện tại quá trình để số lượng hiện tại của quá trình.

Trong mã của bạn: 1P Có # 1 fork() để tăng gấp đôi số lượng quy trình hiện tại. Bây giờ số lượng mới của quá trình 2P

Có # 2 ngã ba() để tăng gấp đôi số lượng quy trình hiện tại. Bây giờ số mới của quá trình 4P

Có # 3 ngã ba() để tăng gấp đôi số lượng quy trình hiện tại. Bây giờ số điện thoại mới của quá trình 8P

Got # 4 fork() nhưng chờ nó ở nếu tình trạng như vậy (8 + 4 = 12) P

Got # 5 fork() để tăng gấp đôi lên số lượng hiện tại của quá trình này. Bây giờ số lượng mới của quá trình 24P

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