GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum gibt ein Programm mit Fork() seine Ausgabe manchmal mehrmals aus?

In Programm 1 Hello world wird nur einmal gedruckt, aber wenn ich \n entferne und führen Sie es aus (Programm 2), die Ausgabe wird 8 Mal gedruckt. Kann mir bitte jemand die Bedeutung von \n erklären hier und wie es den fork() beeinflusst ?

Programm 1

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

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

Ausgabe 1:

hello world... 

Programm 2

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

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

Ausgang 2:

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

Akzeptierte Antwort:

Bei der Ausgabe auf die Standardausgabe mit printf() der C-Bibliothek Funktion wird die Ausgabe normalerweise gepuffert. Der Puffer wird erst geleert, wenn Sie einen Zeilenumbruch ausgeben, rufen Sie fflush(stdout) auf oder beenden Sie das Programm (nicht durch Aufruf von _exit()). obwohl). Der Standardausgabestrom wird standardmäßig auf diese Weise zeilengepuffert, wenn er mit einem TTY verbunden ist.

Wenn Sie den Prozess in „Programm 2“ verzweigen, erben die untergeordneten Prozesse jeden Teil des übergeordneten Prozesses, einschließlich des nicht geleerten Ausgabepuffers. Dadurch wird der nicht geleerte Puffer effektiv in jeden untergeordneten Prozess kopiert.

Wenn der Prozess endet, werden die Puffer geleert. Sie starten insgesamt acht Prozesse (einschließlich des ursprünglichen Prozesses), und der nicht geleerte Puffer wird am Ende jedes einzelnen Prozesses geleert.

Es ist acht denn bei jedem fork() Sie erhalten doppelt so viele Prozesse wie vor fork() (da sie unbedingt sind), und Sie haben drei davon (2 =8).


Linux
  1. Warum verschlingt die Shell-Befehlsersetzung ein nachgestelltes Newline-Zeichen?

  2. Warum druckt Man um 00:30 Uhr „Gimme Gimme Gimme“?

  3. Warum fügt die Ssh -t Option Cr &Lf in der umgeleiteten Ausgabe hinzu?

  4. Python Hello World Beispiel:Wie man ein Python-Programm unter Unix OS schreibt und ausführt

  5. Ruby Hello World Beispiel:Wie man ein Ruby-Programm unter Unix OS schreibt und ausführt

Zeitstempel mit Ping-Befehlsausgabe in Linux drucken

Smalltalk Hello World Beispiel:Wie man ein Smalltalk-Programm unter Linux OS schreibt und ausführt

Fortran Hello World Beispiel:Wie man ein Fortran-Programm unter Linux OS schreibt und ausführt

Warum funktioniert Tomcat mit Port 8080, aber nicht mit 80?

So leiten Sie die Programmausgabe als Eingabe um

Warum kann ich mein System nicht mit einer Gabelbombe zum Absturz bringen?