Yang fork()
primitif sering merentangkan imajinasi. Sampai Anda merasakannya, Anda harus melacak di atas kertas apa setiap operasi itu dan menghitung jumlah proses. Jangan lupa bahwa fork () membuat salinan hampir sempurna dari proses saat ini. Perbedaan paling signifikan (untuk sebagian besar tujuan) adalah bahwa fork()
nilai pengembalian berbeda antara orang tua dan anak. (Karena kode ini mengabaikan nilai pengembalian, tidak ada bedanya.)
Jadi, pada awalnya, ada satu proses. Itu menciptakan proses kedua, yang keduanya mencetak titik dan loop. Pada iterasi kedua mereka, masing-masing membuat salinan lain, jadi ada empat proses mencetak satu titik, dan kemudian keluar. Jadi kami dapat dengan mudah menghitung enam titik, seperti yang Anda harapkan.
Namun, yang printf()
sebenarnya dilakukan adalah buffer outputnya. Jadi titik pertama dari ketika hanya ada dua proses tidak muncul saat ditulis. Titik-titik itu tetap berada di buffer — yang diduplikasi di fork (). Tidak sampai proses keluar akan muncul titik buffered. Empat proses mencetak titik buffered, ditambah yang baru memberikan 8 titik.
Jika Anda ingin menghindari perilaku itu, teleponlah fflush(stdout);
setelahnya printf()
.