GNU/Linux >> Znalost Linux >  >> Linux

Proč program s Fork() někdy tiskne svůj výstup vícekrát?

V Programu 1 Hello world vytiskne se jen jednou, ale když odstraním \n a spusťte jej (Program 2), výstup se vytiskne 8krát. Může mi někdo prosím vysvětlit význam \n zde a jak to ovlivňuje 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();
}

Výstup 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();
}

Výstup 2:

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

Přijatá odpověď:

Při výstupu na standardní výstup pomocí printf() knihovny C výstup je obvykle vyrovnávací paměť. Vyrovnávací paměť se nevyprázdní, dokud nevypíšete nový řádek, zavolejte fflush(stdout) nebo ukončete program (ne voláním _exit() ačkoli). Standardní výstupní proud je ve výchozím nastavení tímto způsobem ukládán do vyrovnávací paměti, když je připojen k TTY.

Když rozvětvíte proces v „Programu 2“, podřízené procesy zdědí každou část nadřazeného procesu, včetně nevyprázdněné výstupní vyrovnávací paměti. To efektivně zkopíruje nevyprázdněnou vyrovnávací paměť do každého podřízeného procesu.

Po ukončení procesu se vyrovnávací paměti vyprázdní. Spustíte celkem osm procesů (včetně původního procesu) a nevyprázdněná vyrovnávací paměť bude vyprázdněna při ukončení každého jednotlivého procesu.

Je osm protože na každém fork() získáte dvojnásobný počet procesů, které jste měli před fork() (protože jsou bezpodmínečné) a máte tři z nich (2 =8).


Linux
  1. Proč substituce příkazů Shell pohltí znak na konci nového řádku?

  2. Proč muž v 00:30 tiskne „gimme Gimme Gimme“?

  3. Proč má Ls -l na výstupu jinou velikost než Ls -s?

  1. Příklad Python Hello World:Jak napsat a spustit program Python na OS Unix

  2. Příklad Ruby Hello World:Jak napsat a spustit program Ruby na OS Unix

  3. Příklad Perl Hello World:Jak napsat a spustit program Perl na OS Unix

  1. Proč Tomcat pracuje s portem 8080, ale ne s 80?

  2. Proč nemohu rozbít svůj systém vidlicovou bombou?

  3. iftop - jak vygenerovat textový soubor s jeho výstupem?