Rumah > Artikel > pembangunan bahagian belakang > Mengapakah gelung fork() ringkas menghasilkan lapan titik dan bukannya dua?
Kes Ingin tahu Cawangan Tidak Dijangka dalam fork()
Pertimbangkan coretan kod berikut yang menggunakan fork() primitif untuk mencipta proses anak:
<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, melaksanakan program ini menghasilkan lapan titik output, enam lebih daripada yang anda jangkakan pada mulanya. Mengapa ini berlaku?
Menyingkap Proses Tersembunyi
Untuk membongkar misteri ini, mari kita mendalami operasi fork(). fork() mencipta replika proses semasa, menghasilkan proses ibu bapa dan anak.
Pada mulanya, terdapat satu proses, yang bercabang menjadi dua. Kedua-dua proses ini secara berperingkat melaksanakan gelung for, mencetak satu titik setiap kali. Pada lelaran kedua, setiap proses bercabang lagi, menghasilkan empat proses. Keempat-empat proses ini mencetak satu titik sebelum ditamatkan.
Output Tertimpan dan Penampilan Tertunda
Walau bagaimanapun, printf() menampan outputnya, bermakna ia mengumpul berbilang cetakan sebelum menghantarnya keluar sekali gus. Apabila keempat-empat proses mencetak titik kedua mereka, mereka mendapat penimbal. Di sinilah kesan licik timbul.
Atas garpu(), titik buffer diwarisi oleh proses anak. Jadi, apabila setiap proses anak keluar, titik penimbalnya muncul pada aliran keluaran. Menambah empat titik tertunda ini pada empat titik yang dicetak secara berperingkat menyumbang jumlah lapan yang tidak dijangka.
Mengelakkan Titik Tertimbal
Untuk memintas gelagat penimbal ini, dinasihatkan untuk menghubungi flush(stdout); selepas setiap pernyataan printf(). Ini memaksa output dihantar dengan segera, memastikan bilangan titik yang dijangkakan dipaparkan.
Atas ialah kandungan terperinci Mengapakah gelung fork() ringkas menghasilkan lapan titik dan bukannya dua?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!