3 Stimmen

Schreiben auf Rohr oder Rohre

Wie lässt sich dies theoretisch am besten bewerkstelligen? Ich möchte, dass der Benutzer die Anzahl der Prozesse eingibt, die an eine Pipe gesendet werden sollen, z. B. "3", und in einer Schleife durch die drei [drei was?] Bei jeder Iteration muss ich einen Prozess erstellen und diesen senden [was?] in die Leitung ein und druckt sie aus.

Wenn der Benutzer das nächste Mal eine andere Zahl eingibt, z. B. "4", soll die vorherige 3 + 1 gedruckt werden. Ich arbeite daran, kann aber nicht verstehen, wie das geht. Hier ist mein Code. Ich brauche nur Anleitung, keine Notwendigkeit zu versuchen, es für mich zu lösen (aber Vorschläge wären sehr willkommen).

Im Moment bin ich in der Lage, einen Prozess durch die Pipe zu schicken und ihn zurückzuschicken, aber dann schließt sich die Pipe und erlaubt es den anderen Prozessen nicht, dort hineinzukommen.

0voto

Jonathan Leffler Punkte 694013

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X