Mengapa fork() Bercabang Lebih Banyak Kali Daripada Jangkaan?
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>
Kod ini harus menghasilkan 6 titik sebagai output, kerana ia bercabang dua kali dan setiap proses mencetak satu titik. Walau bagaimanapun, ia secara mengejutkan mengeluarkan 8 titik. Mengapa ini berlaku?
Fork() dan Proses Duplikasi
Fungsi fork() mencipta pendua hampir sempurna bagi proses semasa. Perbezaan yang paling ketara ialah nilai pulangan berbeza antara proses induk dan anak.
Dalam kod ini, panggilan fork() mencipta empat proses: proses asal dan tiga proses anak. Setiap proses mencetak satu titik apabila ia dibuat, mengambil kira enam titik pertama.
Output Tertimpan
Walau bagaimanapun, terdapat satu tangkapan lagi. printf() menggunakan penimbal untuk menyimpan output sehingga ia disiram atau proses keluar. Dalam kod ini, output tidak disiram sehingga proses keluar.
Akibatnya, titik-titik daripada proses asal dan proses anak pertama kekal dalam penimbal semasa garpu kedua. Apabila baki empat proses (dua dari garpu pertama dan dua dari garpu kedua) keluar, mereka mengepam penimbalnya, menyebabkan titik dicetak. Ini menjadikan jumlah output kepada 8 titik.
Mencegah Output Penimbalan
Untuk mengelakkan tingkah laku ini, anda boleh memanggil fflush(stdout); selepas setiap panggilan printf() untuk memaksa output dibilas dengan serta-merta. Walau bagaimanapun, ini boleh menjejaskan prestasi dalam beberapa senario.
Atas ialah kandungan terperinci Mengapakah `fork()` Menghasilkan Lebih Banyak Titik Daripada Jangkaan dalam Kod Ini?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!