2017-04-07 2 views
0

Ich habe dieses kleine Programm:Wie kann ich 'fork()' ed Kinder teilen stdin machen?

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

int main() { 
    int orig = 1; 
    for (int i = 0; (i != 3) && orig; ++i) { 
     orig = orig && fork(); 
    } 
    if (orig) { 
     for (int i = 0; i != 3; ++i) { 
      wait(NULL); 
     } 
    } else { 
     int num; 
     scanf("%d", &num); 
     printf("%d\n", num*num); 
    } 
} 

Welche Platz drei Zahlen einfach angenommen wird, dass es von stdin liest, aber es nicht wie erwartet funktionieren. Insbesondere sieht es aus wie eines der Kinder „Schweine“, die alle der cat ted Eingang, da das Programm funktioniert in etwa so:

2 
2 
2 

zu

4 
0 
0 

Ich glaube, ich brauche dup zu verwenden, um zu beheben das, aber es gibt fast nichts in unseren Kursmaterialien und alles, was ich im Internet finde, ist viel zu kompliziert für mich, um es zu verstehen. Wie genau kann ich alle Prozesse freigeben stdin?

+0

'dup()' wird nicht helfen. Sie mussten die Kinder synchronisieren und ganze Zeilen lesen ... viel einfacher zu lesen, vor dem Abzweigen. –

+0

Das klingt nach einer sehr schlechten Idee, auch wenn es möglich ist. Wer würde ein Prozess wissen, dass die Eingabe für diesen Prozess gedacht ist? Verwenden Sie einen einzigen Prozess, um die Eingabe an jeden der Mitarbeiter zu senden! – Olaf

+0

Umm .. du meinst wie 'Wie kann ich zwei Züge die gleiche Spur teilen'? – ThingyWotsit

Antwort

0

Wie kann ich 'fork()' ed Kinder teilen stdin machen?

Sofern Sie vorsorgen, es zu vermeiden, die Kinder stdin Aktien zu tun. Aber sie teilen den Strom selbst, die nur eine Leitung für Bytes ist. Die Daten, die den Stream durchlaufen, sind nicht Teil des Streams.

Insbesondere sieht es aus wie eines der Kinder "Schweine" alle der catted Eingang,

Ja. Dieses spezifische Verhalten ist nicht garantiert, aber es ist plausibel und in der Tat wahrscheinlich. Nur ein Prozess kann jedes Byte lesen. Dadurch wird das Byte aus dem Stream entfernt, sodass es für andere Prozesse nicht verfügbar ist. Es gibt einige feine Details rund um das Zusammenspiel von Pufferung und Verzweigung, die unter Umständen ein unterschiedliches Verhalten hervorrufen können, aber die Vermeidung solcher Komplikationen ist wichtig.

Sie benötigen ein anderes Kommunikationsmuster. Hier sind einige der plausibleren Alternativen:

  • Vorlesen. Der ursprüngliche Prozess liest alle benötigten Daten aus dem Stream und zeichnet sie im Speicher auf. Jeder fork() ed child erbt eine Kopie der Daten, mit denen er arbeiten soll.

  • Eingang Multiplexing. Der Hauptprozess oder ein zusätzlicher Prozess, der eingerichtet wird, übernimmt die Verantwortung für das Lesen von Stdin. Er leitet, was es zu jedem der anderen Prozessen über Rohrleitungen (eine für jede der drei ursprünglichen Kinder)

  • Eingang Bus liest. Die untergeordneten Prozesse sind über Pipes miteinander verbunden (die bei Bedarf auf ihren Standardstreams eingerichtet werden können); Welche Daten sie auch lesen, sie leiten sie auch an das nächste Kind über die Leitung weiter, zusätzlich zu ihrer regulären Arbeit.

0

Nur ein untergeordneter Prozess liest von stdin und leert den Dateieingangspuffer, er wird nicht automatisch an ALLE untergeordneten Elemente gesendet. Siehe Reading from stdin by multiple processes für ein ähnliches Szenario; Bitte beachten Sie, dass scanf auch FILE * gepufferte Eingaben verwendet, so dass die Schlussfolgerung dieselbe ist.

Es sollte das übergeordnete Element sein, das die Eingabedaten liest und dann an alle untergeordneten Elemente eins nach dem anderen sendet.

Verwandte Themen