Pipe als Ring
-
Hallo
kann mir jemand erklären wie ich mit C und Hilfe der Pipes eine Art Ring basteln kann?
Also genauer gesagt, ich will mehrere Kindprozesse erzeugen welche dann einen Token untereinander im Ring weitergeben.
Wie mach ich sowas????
-
hmm, was ist dein Ansatz bzw. wo hapert es?
-
Also....
ich dachte mit das in etwa so,
hab nen Vaterprozess (Init).
Von dem soll eine n Anzahl von Kindern geforkt werden.
Soweit so gut.
Mein hauptproblem gesteht darin, das ich nicht weiß wie man nun die kinder untereinander mit der pipe verbindet (wohl irgendwie über die Prozess ID) und natürlich das letzte kind wieder mit dem Init, so das ein Token Ring entsteht.
Ist es so, dass eine pipe ausreicht der ich immer nur die PID von Schreiber und Leser gebe (wenn ja wie geht das?)?
Oder muß für jedes kind zum nächsten wieder eine Pipe angelegt werden?Ich hoffe das war jetzt nicht zu konfus!
-
ist nicht konfus. Ich versteh nur nicht, wo dein Problem ist, bei dem ich dir helfen kann. Du musst dich eben nur informieren, wie man pipes anlegt
man: pipe(2)
http://www.ecst.csuchico.edu/~beej/guide/ipc/pipes.html
-
Ich hab da aber ehrlich gesagt auch schon bissel rumgerätselt und probiert.
An sich ist mir das mit den Pipes klar und wie ich da was anleg.
Doch dann haperts...ich weiß wie Sohn mit Vater kommuniziert, aber ich weiß nicht genau wie man Kindprozesse mit nem anderen Kindprozess kommunizieren lassen tut.
Bzw ne Frage...wenn mehrere Kindprozesse angelegt werden, entsteht da so ne Art Baumstruktur...also ich weiß nciht genau wie ichs erklären soll...sind dann auch Kinder dann die Väter von den Unterkindern?
Glaub es scheitert bei mir eher am Verständnis als an der Programmierung. Hab die Man-Pages auch gelesen, aber irgendwie wills nicht.
-
Wenn Dein Vater alle Kindprozesse erzeugen soll, wird es glaube ich sehr schwer, Kind1 mit Kind2 kommunizieren lassen. Dann müsstest Du bevor Du das erste mal forkst alle Pipes anlegen und dann nach dem Forken bei jedem neuen Kindpozess die ungenutzten Pipe-Enden für dieses Kind schliessen und nach dem Du alle Kinder geforkt hast schliesslich alle unbenutzten Enden des Vaterprozessen schliessen. Du musst also immer alle Filediskreptoren, bis auf 2 schließen. Damit liesse sich ein echter Ring aufsetzen. Ein genereller Nachteil an einem solchen (einfachen) Ring ist allerdings, dass wenn ein Prozess hängt, ist der gesamte Nachrichtenaustausch tot.
Alternativ könntest Du für jeden Kindprozess jeweils 2 Pipes anlegen (also 4 fd's), über die die Kinder jeweils mit dem Vater bidirektional kommunizieren können und der Vater dann als Dispatcher agiert. Physikalisch ist das natürlich kein Ring mehr, aber ein entsprechendes Protokoll könnte daraus einen logischen Ring machen.
Wenn dieser Weg Dir brauchbarer erscheint, solltest Du Dir allerdings zwecks evtl. großen zu übermittelnden Nachrichten noch Gedanken über SharedMemory und Semaphoren machen, kann dann nämlich die Performance erheblich steigern.