Rumah >pembangunan bahagian belakang >C++ >Mengapa Gelung `fork()` Saya Menghasilkan Lebih Banyak Output daripada Jangkaan?

Mengapa Gelung `fork()` Saya Menghasilkan Lebih Banyak Output daripada Jangkaan?

DDD
DDDasal
2024-11-04 07:46:31253semak imbas

Why Does My `fork()` Loop Produce More Output than Expected?

Mengapa fork() Bercabang Lebih 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>

Apabila dilaksanakan, program ini secara mengejutkan mengeluarkan output 8 titik dan bukannya 6 yang dijangkakan. Bagaimanakah ini boleh berlaku?

Gelagat fork()

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.

Menjejaki Pelaksanaan

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.

Penimbalan dan Output Tertunda

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.

Mencegah Output 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn