Rumah >pembangunan bahagian belakang >C++ >Mengapakah `fork()` Mengeluarkan 8 Titik Daripada 6 dalam Kod Ini?

Mengapakah `fork()` Mengeluarkan 8 Titik Daripada 6 dalam Kod Ini?

Patricia Arquette
Patricia Arquetteasal
2024-11-03 17:32:30292semak imbas

Why Does `fork()` Output 8 Dots Instead of 6 in This Code?

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:

  1. Keadaan Awal: Terdapat satu proses yang dilaksanakan.
  2. Lelaran Pertama: Proses bercabang, mencipta proses kanak-kanak dengan ruang memori yang berasingan. Kedua-dua ibu bapa dan anak mencetak satu titik.
  3. Lelaran Kedua: Kedua-dua ibu bapa dan anak bercabang sekali lagi, menghasilkan empat proses. Setiap satu mencetak satu titik.
  4. Penamatan Proses: Keempat-empat proses ditamatkan, tetapi titik penimbal daripada operasi cetakan terdahulu kekal dalam penimbal output.

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!

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