Pertimbangkan coretan kod berikut:
<code class="c">#include <stdio.h> #include <sys/types.h> #include <unistd.h> int main(void) { int i; for(i = 0; i < 2; i++) { fork(); printf("."); } return 0; }</code>
Apabila dilaksanakan, program ini secara mengejutkan mengeluarkan output 8 titik dan bukannya 6 yang dijangkakan. Bagaimanakah ini boleh berlaku?
Untuk memahami output yang tidak dijangka, kita mesti menyelidiki selok-belok fork() primitif. Apabila fork() dipanggil, ia mencipta salinan hampir sempurna proses semasa. Perbezaan yang paling ketara (untuk kebanyakan tujuan) ialah nilai pulangan yang berbeza untuk proses ibu bapa dan anak. Walau bagaimanapun, kod yang diberikan mengabaikan nilai pulangan ini, dengan berkesan menjadikan perbezaan ini tidak relevan.
Pada mulanya, wujud satu proses. Selepas itu, ia mencipta proses kedua, menghasilkan dua proses mencetak titik dan meneruskan gelung. Pada lelaran kedua mereka, setiap proses sekali lagi mencipta salinan, membawa kepada empat proses yang mencetak titik dan kemudian keluar. Ini menerangkan enam titik pertama.
Walau bagaimanapun, printf() menggunakan penimbalan output. Oleh itu, titik awal yang dicetak oleh kedua-dua proses tidak dapat dilihat dengan serta-merta. Titik-titik ini kekal penimbal dan diduplikasi semasa fork(). Hanya apabila proses keluar, titik penimbal disiram dan muncul. Oleh itu, empat proses mengeluarkan titik buffer, bersama-sama dengan satu titik baharu, menghasilkan output 8 titik yang tidak dijangka.
Untuk menyekat tingkah laku ini, fflush(stdout); boleh dipanggil selepas setiap pernyataan printf(), dengan itu memastikan titik-titik tersebut dipaparkan dengan serta-merta.
Atas ialah kandungan terperinci Mengapa Gelung `fork()` Saya Menghasilkan Lebih Banyak Output daripada Jangkaan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!