pipe fork parent child

drob

Mitglied
nabend schön / morgen
ich möchte mit einer anwendung mehreren kindprozessen starten und stdout/stderr entgegennehmen. dazu habe ich pipe und fork verwendet.

zum testen habe ich dem kindprozess
Code:
system("ping google.de");
zu tun gegeben. der vaterprozess ließt auf der pipe und gibt es aus
Code:
while (read(p2c[0], readbuffer, sizeof(readbuffer)) > 0) {
	sleep(1);
	printf("%s", readbuffer);
	fflush(stdout);
}

meine problem ist, dass in der ausgabe einträge doppelt gelesen/ausgegeben werden. Das lässt sich an der "icmp_seq=1" in jeder zweiten zeile ganz gut erkennen.
Code:
PING google.de (66.249.93.104) 56(84) bytes of data.
64 bytes from ug-in-f104.google.com (66.249.93.104): icmp_seq=1 ttl=245 time=69.3 ms
64 bytes from ug-in-f104.google.com (66.249.93.104): icmp_seq=2 ttl=245 time=68.4 ms
com (66.249.93.104): icmp_seq=1 ttl=245 time=69.3 ms
64 bytes from ug-in-f104.google.com (66.249.93.104): icmp_seq=3 ttl=245 time=68.3 ms
com (66.249.93.104): icmp_seq=1 ttl=245 time=69.3 ms
64 bytes from ug-in-f104.google.com (66.249.93.104): icmp_seq=4 ttl=245 time=66.3 ms
com (66.249.93.104): icmp_seq=1 ttl=245 time=69.3 ms
64 bytes from ug-in-f104.google.com (66.249.93.104): icmp_seq=5 ttl=245 time=68.1 ms
com (66.249.93.104): icmp_seq=1 ttl=245 time=69.3 ms
64 bytes from ug-in-f104.google.com (66.249.93.104): icmp_seq=6 ttl=245 time=69.5 ms
com (66.249.93.104): icmp_seq=1 ttl=245 time=69.3 ms


auch beendet der vaterprozess das read auf der pipe nicht, wenn der kindprozess fertig ist, und nichts mehr sendet.

hat jemand eine idee?
würde gerne auch verstehen, warum die pipe "geleert" wird!
bin für jeden ansatz dankbar


gruss
 
Hi.

Warum verwendest du nicht einfach popen?

Die read Funktion terminiert den String nicht. Außerdem ist nicht gesagt wieviel Zeichen überhaupt eingelesen wurden.

Dann solltest du im Kindprozess den FD schließen, sonst wartet der Vaterprozess natürlich ewig das noch was kommt, es schreibt aber keiner mehr was rein...

Gruß

PS: Wenn du die Ausgabe grundsätzlich zeilenorientiert verarbeiten willst, dann solltest du fdopen und fgets verwenden.
 
Zuletzt bearbeitet:
danke für die schnelle antwort...
doch bekomme ich mit popen keine stderr-meldungen?
(die landen direkt beim parent-prozess auf der console)
 
Zurück