C / Linux - Server - Terminal-Kommunikation mit Named Pipes

8

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:

  • Nur 1 Server;
  • 1 oder mehr Terminals;

Tatsächlich funktioniert meine Anwendung so:

  • Das Terminal sendet eine command_t Struktur über eine Named Pipe ( in rot ) an den Server. Diese benannte Pipe ist ein FIFO und wird von allen Terminals gemeinsam genutzt. Nach dem Senden der command_t Struktur wird das Terminal versuchen, die Antwort von einer anderen Named Pipe ( in blau ) zu lesen und es wird blockiert, bis der Server etwas in diese Pipe schreibt.
  • Der Server liest aus der benannten Pipe ( in rot ) und verarbeitet die empfangenen Befehle (command_t-Struktur) nach dem Prinzip "Wer zuerst kommt, mahlt zuerst". Es gibt mehrere Threads, was bedeutet, dass mehrere Anfragen gleichzeitig verarbeitet werden.
  • Nach der Verarbeitung des Befehls sendet der Server eine Struktur reply_t durch eine andere benannte Pipe ( in blau ).

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 Oliveira 02.12.2016, 02:21
quelle

2 Antworten

1

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.

    
Isaac Gómez 13.01.2017 06:07
quelle
0

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 .

    
Nico Osorio 07.09.2017 20:11
quelle

Tags und Links