Vorschlag Nr. 1: Funktionen verwenden
Verwenden Sie Funktionen, auch für kleine Aufgaben wie z. B.:
void create_fifo(const char *name)
{
/* Create the first named - pipe */
int ret_val = mkfifo(name, 0666);
if ((ret_val == -1) && (errno != EEXIST))
{
perror("Error creating the named pipe");
exit(1);
}
}
Jetzt können Sie einfach in Ihr Hauptprogramm schreiben:
create_fifo(PIPE1);
create_fifo(PIPE5);
Dies verringert das Durcheinander in Ihrem Hauptprogramm. Außerdem wird der agile Grundsatz DRY - Don't Repeat Yourself - eingehalten.
Vorschlag Nr. 2: Systemaufrufe auf Fehler überprüfen.
Das haben Sie für die Erstellung der FIFOs getan, was gut ist. Sie tun es nicht für die open()
Anrufe, oder die read()
ou write()
Anrufe. Das sollten Sie wahrscheinlich. Ich verwende in meinen Programmen eine ähnliche Funktion wie die folgende:
#include <stdarg.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
static const char *arg0 = "did not call err_setarg0(argv[0])";
void err_setarg0(const char *argv0)
{
arg0 = argv0;
}
void err_exit(const char *fmt, ...)
{
int errnum = errno; /* Capture errno before it is changed */
va_lists args;
fprintf(stderr, "%s: ", arg0);
va_start(args, fmt);
vfprintf(stderr, fmt, args);
va_end(args);
if (errnum != 0)
fprintf(stderr, "%d: %s\n", errnum, strerror(errnum));
exit(1);
}
Sie können dann verwenden:
if ((rdfd1 = open(PIPE1, O_RDONLY)) < 0)
err_exit("Failed to open FIFO %s for reading: ", PIPE1);
if ((wrfd1 = open(PIPE5, O_WRONLY)) < 0)
err_exit("Failed to open FIFO %s for writing: ", PIPE5);
Vorschlag Nr. 3: Einen iterativen Server einrichten
Ihr Serverprogramm öffnet derzeit die FIFOs einmal, liest dann aus einem, schreibt in den anderen und beendet sich. Sie brauchen eine Schleife um einen Teil dieses Codes, vielleicht zwei verschachtelte Schleifen. Sie müssen entscheiden, ob Sie eine innere Schleife zum Lesen bis EOF benötigen. Sie müssen auch wissen, wie Sie den Server beenden wollen.
Vorschlag #4: Vielleicht braucht der Server Pipe-Namen als Argumente
Ihr Server arbeitet derzeit mit festen FIFO-Namen. Wahrscheinlich muss er die Namen von Ein- und Ausgabedateien als Kommandozeilenargumente akzeptieren, damit, wenn Ihr Client mehrere Server erzeugt, jeder Server seinen eigenen Satz von FIFOs haben kann, anstatt dass sich alle Prozesse dieselben zwei FIFOs teilen, was zu Verwirrung und Chaos führen würde.
Die Notwendigkeit, Namen zu generieren, stellt in der Tat den gesamten Entwurf in Frage - sind Sie sicher, dass die Verwendung von FIFOs die beste Lösung ist? Für mich sieht das nach einem Fall aus, in dem anonyme Pipes besser geeignet wären; Sie müssten keine Namen erfinden, und der Server würde einfach von seiner Standardeingabe lesen und die (geänderten?) Daten in seine Standardausgabe schreiben, so dass Sie sogar einfach cat
ou tr
ou sed
oder ... als Ihren Server.
Wenn Sie Pipes verwenden, müssen Sie natürlich eine sorgfältige Planung vornehmen, aber auch die FIFO-Paare pro Server müssen sorgfältig geplant werden.