PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C: fork() & Ausgaben



ContainerDriver
20-12-2004, 19:29
Hallo.
Ich spiele (mal wieder) etwas mit fork() herum (für irgendetwas kann man das sicher mal gebrauchen).
Ich halte mich dabei an das Tut von www.pronix.de (das ist aber nicht so wichtig).
Jetzt erstmal das Codebeispiel:


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

int main(void)
{
printf("Starting (%d/%d)!\n",getpid(),getppid());
printf("Sleeping\n");

sleep(100);
int i=0;
for (i=0;i<100;i++)
{
printf("%d: %d\n",getpid(),i);
}

switch(fork())
{
case -1:
printf("fork() failed!\n");
break;
case 0:
printf("child (%d/%d)\n",getpid(),getppid());
break;
default:
printf("parent (%d/%d)\n",getpid(),getppid());
}

return 0;
}


So, wenn man das kompiliert & linkt & dann ausführt passiert das, was passieren sollte:


Starting (2508/2377)!
Sleeping
2508: 0
...
child (2509/2508)
parent (2508/2377)

.
Wenn man allerdings die Ausgabe in eine Datei umleitet, ergibt sich ein etwas anderes Bild:
es erscheint die selbe Ausgabe wie oben (andere PIDs) & dann nochmal die selbe Ausgabe (ohne die child ()-Zeile)!


Starting (2508/2377)!
Sleeping
2508: 0
...
child (2509/2508)
Starting (2508/2377)!
Sleeping
2508: 0
...
parent (2508/2377)

Das Programm selbst läuft aber nur 10 sec.
Wie ist die doppelte Ausgabe bei Ausgabeumlenkung zu erklären ("erbt" das Kind die Ausgabe (Ausgabepuffer) von den Eltern, weil ja die selben PIDs z.B. bei Starting () stehen*)?

Wenn sich jmd. die Mühe machen würde, meine Frage zu beantworten würde ich mich sehr freuen.

Gruß, Florian

*) Wenn man den Ausgabepuffer nach der letzten Ausgabe mit fflush(stdout) leert erscheint nur die obige Ausgabe (also nicht doppelt). In dem Tut von Pronix wird das selbe Problem geschildert, ich verstehe aber die Erkärung nicht.