Ich arbeite an einem Projekt für das College, wo ich nur Named Pipes (mkfifo ()) verwenden kann, um die Kommunikation zwischen einem Server und einem Terminal (beide von mir erstellt) herzustellen.
Es gibt:
Tatsächlich funktioniert meine Anwendung so:
Das Problem:
Wenn ich den Server mit nur einem Thread starte, funktioniert das alles gut, weil die Antworten (reply_t) in der Reihenfolge des Eintreffens der Befehle gesendet werden ( command_t )
Aber wenn ich den Server mit mehr als einem Thread starte, kann ich nicht garantieren, dass die Antworten in der gleichen Reihenfolge gesendet werden, in der die Befehle ankommen, und das bringt mir gemischte Antworten (etwas, das ich im Terminal erhalten werde) 1 das Ergebnis der Ausführung aus dem Befehl von Terminal 2 und etc ...).
Ich habe darüber nachgedacht, so etwas zu machen:
In dieser Lösung würde ich eine Ausgangs-PIPE für jedes mit dem Server verbundene Terminal anstelle eines PIPE-Ausgangs haben, der zwischen allen Terminals geteilt wird. Aber wie kann ich eine variable Anzahl von Terminals in C implementieren? Ich kann nicht einmal erkennen, wenn ein neues Terminal den Eingang PIPE öffnet.
Irgendwelche Vorschläge? Danke!
Daniel,
Ich habe zuvor einen ähnlichen Server implementiert, Sie können ein Terminal abhören, und wenn das Terminal die Nachricht beendet, können Sie den Prozess abzweigen und die Antwort an den untergeordneten Prozess zurücksenden, während Sie im übergeordneten Prozess in einer Schleife einen anderen Listener erstellen für das nächste Terminal, wie ccarton sagte:
In etwa so:
%Vor%Hier finden Sie eine vollständige Erklärung: Ссылка
Unter Abschnitt "Erweiterungen des Servercodes".
Hoffe, das hilft.
Eine Möglichkeit, den Server mit dem Terminal zu synchronisieren, ist die Verwendung von System V Semaphor . Der Semaphor wird von einem Terminal genommen, bevor er beginnt, für "x" Minuten auf den Kanal "zu hören". Wenn eine Nachricht eintrifft, sendet das Terminal die Antwort zurück, andernfalls, wenn eine Zeitüberschreitung auftritt, wird das Semaphor freigegeben, so dass das andere Endgerät zuhören kann. Das Problem dabei ist, dass Sie die Möglichkeit verlieren, mehrere Nachrichten parallel zu verarbeiten.
Ein anderer Ansatz ist, wie @Moulin gesagt hat, um eine ID zu verwenden (zB die von fork()
zurückgegebene PID) in Ihren Strukturen command_t
und reply_t
.
Tags und Links c multithreading linux bash