Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah gelung fork() ringkas menghasilkan lapan titik dan bukannya dua?

Mengapakah gelung fork() ringkas menghasilkan lapan titik dan bukannya dua?

Susan Sarandon
Susan Sarandonasal
2024-11-04 02:04:02434semak imbas

Why does the simple fork() loop produce eight dots instead of two?

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!

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