Gelagat Cawangan Tidak Dijangka Fork()
Pertimbangkan kod berikut yang menggunakan panggilan sistem fork():
<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>
Anehnya, apabila program ini dilaksanakan, ia mengeluarkan 8 titik dan bukannya 6 yang dijangkakan. Percanggahan ini pada mulanya kelihatan membingungkan.
Membedah Pelaksanaan Kod
Untuk memahami tingkah laku ini, kita mesti memecahkan proses pelaksanaan langkah demi langkah:
Output Tertimbal
Inti isu terletak pada output tertimbal printf(). Apabila proses mencetak, output tidak serta-merta dipancarkan ke skrin. Sebaliknya, ia disimpan dalam penimbal. Tingkah laku ini penting kerana panggilan sistem fork() menyalin penimbal, menghasilkan titik penimbal pendua.
Sejumlah 8 Titik
Apabila empat proses ditamatkan, titik penimbalnya disiram, menambahkannya pada titik tunggal yang dicetak pada mulanya. Ini menyebabkan sejumlah 8 titik dikeluarkan.
Mengelakkan Isu
Untuk mengelakkan tingkah laku ini, seseorang boleh secara eksplisit mengepam penimbal keluaran menggunakan fflush(stdout) selepas setiap panggilan printf(). Ini memastikan output dihantar dengan segera ke skrin, menghapuskan percanggahan antara bilangan proses dan bilangan titik bercetak.
Atas ialah kandungan terperinci Mengapakah `fork()` Mengeluarkan 8 Titik Daripada 6 dalam Kod Ini?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!