fork()
ดั้งเดิมมักจะเหยียดจินตนาการ จนกว่าคุณจะรู้สึกถึงมันคุณควรติดตามบนกระดาษว่าการดำเนินการแต่ละอย่างและบัญชีเกี่ยวกับจำนวนกระบวนการ อย่าลืมว่า fork () สร้างสำเนาที่สมบูรณ์แบบของกระบวนการปัจจุบัน ความแตกต่างที่สำคัญที่สุด (เพื่อจุดประสงค์ส่วนใหญ่) คือfork()
มูลค่าการส่งคืนที่แตกต่างระหว่างผู้ปกครองและเด็ก (เนื่องจากรหัสนี้ไม่สนใจค่าส่งคืนจึงไม่มีความแตกต่าง)
ดังนั้นในตอนแรกมีกระบวนการเดียว ที่สร้างกระบวนการที่สองซึ่งทั้งสองพิมพ์จุดและวนรอบ ในการวนซ้ำครั้งที่สองแต่ละครั้งจะสร้างสำเนาอีกชุดหนึ่งดังนั้นจึงมีสี่กระบวนการที่พิมพ์จุดแล้วออก ดังนั้นเราสามารถอธิบายจุดหกจุดได้ง่ายอย่างที่คุณคาดหวัง
อย่างไรก็ตามสิ่งที่ทำprintf()
จริงๆคือบัฟเฟอร์การส่งออก ดังนั้นจุดแรกจากเมื่อมีเพียงสองกระบวนการไม่ปรากฏขึ้นเมื่อเขียน จุดเหล่านั้นยังคงอยู่ในบัฟเฟอร์ซึ่งทำซ้ำที่ fork () มันไม่ได้จนกว่ากระบวนการกำลังจะออกจากจุดบัฟเฟอร์ที่ปรากฏขึ้น กระบวนการสี่พิมพ์จุดบัฟเฟอร์รวมทั้งกระบวนการใหม่ให้ 8 จุด
หากคุณต้องการหลีกเลี่ยงพฤติกรรมนั้นให้โทรหาfflush(stdout);
หลังจากprintf()
นั้น