Người fork()
nguyên thủy thường kéo dài trí tưởng tượng. Cho đến khi bạn cảm nhận được điều đó, bạn nên tìm ra trên giấy mỗi hoạt động là gì và chiếm số lượng 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 quy 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à fork()
giá trị trả về khác nhau giữa cha mẹ và con cái. (Vì mã này bỏ qua giá trị trả về, nên nó không có sự khác biệt.)
Vì vậy, lúc đầu, có một quá trình. Điều đó tạo ra một quy 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, mỗi lần tạo một bản sao khác, do đó, có bốn quy trình in một dấu chấm, rồi thoát. Vì vậy, chúng tôi có thể dễ dàng chiếm sáu chấm, như bạn mong đợi.
Tuy nhiên, những gì printf()
thực sự làm là đệm đầu ra của nó. Vì vậy, dấu chấm đầu tiên từ khi chỉ có hai quá trình không xuất hiện khi được viết. Những dấu chấm đó vẫn còn trong bộ đệm Bộ đệm được nhân đôi tại fork (). Chỉ đến khi quá trình chuẩn bị thoát ra thì dấu chấm đệm mới xuất hiện. Bốn quy trình in một dấu chấm đệm, cộng với quy trình mới cho 8 chấm.
Nếu bạn muốn tránh hành vi đó, hãy gọi fflush(stdout);
sau printf()
.