GNU/Linux >> Belajar Linux >  >> Linux

Mengapa Program Dengan Fork() Terkadang Mencetak Outputnya Beberapa Kali?

Dalam Program 1 Hello world dicetak hanya sekali, tetapi ketika saya menghapus \n dan jalankan (Program 2), hasilnya dicetak 8 kali. Dapatkah seseorang tolong jelaskan kepada saya pentingnya \n di sini dan bagaimana pengaruhnya terhadap fork() ?

Program 1

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("hello world...\n");
    fork();
    fork();
    fork();
}

Keluaran 1:

hello world... 

Program 2

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("hello world...");
    fork();
    fork();
    fork();
}

Keluaran 2:

hello world... hello world...hello world...hello world...hello world...hello world...hello world...hello world...

Jawaban yang Diterima:

Saat mengeluarkan ke keluaran standar menggunakan printf() perpustakaan C fungsi, output biasanya buffer. Buffer tidak di-flush sampai Anda mengeluarkan baris baru, panggil fflush(stdout) atau keluar dari program (bukan dengan memanggil _exit() meskipun). Aliran keluaran standar secara default disangga baris dengan cara ini saat terhubung ke TTY.

Saat Anda melakukan fork proses di “Program 2”, proses anak mewarisi setiap bagian dari proses induk, termasuk buffer output yang tidak dibilas. Ini secara efektif menyalin buffer yang tidak dibilas ke setiap proses anak.

Ketika proses berakhir, buffer di-flush. Anda memulai total delapan proses (termasuk proses asli), dan buffer yang tidak dibilas akan dihapus pada penghentian setiap proses individu.

Ini delapan karena pada setiap fork() Anda mendapatkan dua kali jumlah proses yang Anda miliki sebelum fork() (karena mereka tidak bersyarat), dan Anda memiliki tiga di antaranya (2 =8).


Linux
  1. Mengapa Pergantian Perintah Shell Melahap A Trailing Newline Char?

  2. Bagaimana Suatu Program Memutuskan Apakah Memiliki Output Berwarna atau Tidak?

  3. Mengapa Opsi Ssh -t Menambahkan Cr &Lf Dalam Output yang Dialihkan?

  1. Mengapa Ls -l Menghasilkan Ukuran Yang Berbeda Dari Ls -s?

  2. Ruby Hello World Contoh:Cara Menulis dan Menjalankan Program Ruby di Unix OS

  3. Perl Hello World Contoh:Cara Menulis dan Menjalankan Program Perl di Unix OS

  1. Smalltalk Hello World Contoh:Cara Menulis dan Menjalankan Program Smalltalk di OS Linux

  2. Fortran Hello World Contoh:Cara Menulis dan Menjalankan Program Fortran di OS Linux

  3. Contoh XQuery Hello World:Cara Menulis dan Menjalankan Program XQuery di OS Linux