2016-08-09 44 views
1

Wenn der Aufruf von fork() erfolgreich ausgeführt wird, erstellt Unix zwei identische Kopien der Adressräume, einen für den übergeordneten und den anderen für den untergeordneten. Beide Prozesse starten ihre Ausführung bei der nächsten Anweisung nach dem Aufruf von fork(). [Ref: http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/create.html].Konzepte auf fork() Systemaufruf

Also, wenn ich den folgenden Code ausführen:

#include <stdio.h> 
int main(void) 
{ 
    printf("Hello\n"); 
    fork(); 
    printf("World\n"); 
    return 0; 
} 

ich denke, es

Hello 
World 
World 

druckt Aber wenn ich das Programm ausführen druckt es

Hello 
World 
Hello 
World 

Bitte erklären, wo fehlt mir das Konzept?

+0

Seltsam, ich bekomme die erwartete Ausgabe. Hallo Welt Welt – Rusty

+0

Ich denke, wenn Sie printf() verwenden, können Sie nicht haben Hallo Welt Welt o/p.korrekt mich, wenn ich falsch liege. – Hailey

+0

Sie werden "Hello World World" als Ausgabe haben, ich kopierte einfach und kompilierte den Code, und bekam das gleiche und das ist, was ich erwartet hatte. – Rusty

Antwort

2

Hier geht es um Pufferung. Wenn Sie "Hallo" drucken, wird es nicht sofort ausgegeben. Stattdessen geht es in einen Puffer. Es ist immer noch während der Verzweigung vorhanden. Wenn also jede Task ihren Puffer beendet und löscht, werden zwei Kopien zur Ausgabe gesendet.

Um dem entgegenzuwirken, könnten Sie ungepufferte E/A angeben oder fflush vor dem Fork aufrufen, um den Puffer zu löschen.

+0

@Gilles entfernt meine Erwähnung der Verwendung von Terminal-Eingang, um Terminal-Ausgang zu spülen. Ich denke immer noch, dass es erwähnenswert ist. 'fflush' funktioniert natürlich auch. Es ist einfach schicker. – Andrew

+0

Ich sehe nicht, was es "schicker" macht. 'fflush' hat den Vorteil, einfacher zu sein und immer zu arbeiten. Die Verwendung der Terminal-Eingabe funktioniert nur, wenn Sie Terminal-Eingaben lesen, was oft nicht der Fall ist. – Gilles

+0

@Gilles, meine Idee ist, dass OP ein Anfänger ist, also nicht mit einem breiten Spektrum von Systemaufrufen vertraut ist. Ich möchte in einfachen Worten antworten, damit er die Idee bekommt, ohne sich in eine neue Dokumentation vertiefen zu müssen. Terminal I/O ist, wo die meisten Leute anfangen. – Andrew