Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah `fork()` Menghasilkan Lebih Banyak Titik Daripada Jangkaan dalam Kod Ini?

Mengapakah `fork()` Menghasilkan Lebih Banyak Titik Daripada Jangkaan dalam Kod Ini?

Susan Sarandon
Susan Sarandonasal
2024-11-04 01:31:02714semak imbas

Why Does `fork()` Produce More Dots Than Expected in This Code?

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!

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