Nguyên mẫu fork()
thường kéo dài trí tưởng tượng. Cho đến khi bạn có được một cảm giác cho nó, bạn nên theo dõi trên giấy những gì từng hoạt động và tài khoản cho số lượng các quy trình. Đừng quên rằng fork() tạo ra một bản sao gần như hoàn hảo của quá trình hiện tại. Sự khác biệt đáng kể nhất (đối với hầu hết các mục đích) là giá trị trả về của fork()
khác nhau giữa cha mẹ và con. (Vì mã này bỏ qua giá trị trả về, nó không tạo ra sự khác biệt.)
Vì vậy, lúc đầu, có một quy trình. Điều đó tạo ra một quá trình thứ hai, cả hai đều in một dấu chấm và vòng lặp. Trong lần lặp thứ hai của họ, mỗi lần tạo một bản sao khác, vì vậy có bốn quy trình in một dấu chấm và sau đó thoát ra. Vì vậy, chúng tôi có thể dễ dàng tính đến sáu dấu chấm, như bạn mong đợi.
Tuy nhiên, những gì printf()
thực sự là bộ đệm đầu ra của nó. Vì vậy, dấu chấm đầu tiên khi chỉ có hai quy trình không xuất hiện khi được viết. Các chấm đó vẫn nằm trong vùng đệm — được sao chép ở ngã ba(). Nó không phải là cho đến khi quá trình sắp thoát ra mà dấu chấm đệm xuất hiện. Bốn quy trình in một chấm đệm, cộng với một quy trình mới cho 8 dấu chấm.
Nếu bạn muốn tránh hành vi đó, hãy gọi fflush(stdout);
sau printf()
.
[Kiểm tra bài đăng này] (http://stackoverflow.com/questions/10909011/how-to-use-fork-to-create-only-2-child-processes/10909090#10909090) – tuxuday
http: //ideone.com/B9HXL –