2 Named Pipe in einem Prozess verwenden

Post Reply
Message
Author
macke_a

2 Named Pipe in einem Prozess verwenden

#1 Post by macke_a »

Hallo !

Besteht die Möglichkeit zwei "Named Pipes" in einem Prozess zu verwenden?

Die beiden NP´s haben unterschiedliche Namen, dementsprechend mussten sie doch auch unabhängig voneinander sein, oder ?

Zum anderen möchte ich die eine Pipe nur zum "WRONLY" und die andere zum "RDONLY" haben.

mkfifo("/tmp/guipipe",0666);
fdgui = open("/tmp/guipipe",O_RDONLY);

mkfifo("/tmp/zsepipe",0666);
fdzse = open("/tmp/zsepipe",O_WRONLY);

Diese beiden FIFO´s werden in einem Prozess erzeugt und sollen von zwei Prozessen aus genutzt werden.

Nun, ich habe mal versucht beide FIFO´s zu nutzen, allerdings bekomme ich dann Probleme mit meinem Programm( NEUSTART MUSS ERFOLGEN)

Ich möchte eigentlich nur bestätigt haben, ob es überhaupt möglich ist, zwei FIFO´s in einem Prozess zu initialisieren und in zwei Prozessen zu nutzen!

Ich bin dankbar für jede Hilfe, da ich schon fast ne Woche an diesem Probleme sitze!

Mfg macke_a

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#2 Post by Janka »

Natürlich geht das. Du musst aber nun nichtblockierend arbeiten, um beide Fifos bedienen zu können.

$ man fcntl
$ man poll
$ man select

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

macke_a

#3 Post by macke_a »

Zitat: "Natürlich geht das. Du musst aber nun nichtblockierend arbeiten, um beide Fifos bedienen zu können."

Also d.h. es darf maximal ein FIFO geöffnet sein ? Ich kann nur einen FIFO zum schreiben und lesen benutzten? Falls das so ist, mußte ich einen FIFO schließen, ist das mit close(FIFO) ausreichend?


Wäre nett, wenn ich noch ein paar Tips bekommen könnte, in der Zeit schaue ich mir mal die
$ man´s an!

Besten Dank im Voraus!

macke_a

#4 Post by macke_a »

Oder kann ich beide Named Pipes gleichzeitig nutzen?

Blockierend: Sender wartet, bis die Nachricht vom Kommunikationssystem abgenommen wurde (und der Puffer wieder frei ist).

Aber wir programmiere ich denn so etwas?

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#5 Post by Janka »

Nein, du musst keinen Fifo schließen. Du musst mit fcntl() den Filedeskriptor auf nichtblockierend setzen. Dann baust du dir eine Hauptschleife, die in einem poll() auf *beide* Fifos darauf wartet, das *in einem der* Fifos irgendwas passiert. Darauf reagierst du dann mit read() oder write(). Achtung: Alle Aufrufe können jetzt zusätzliche Fehler (z.B. EAGAIN) produzieren, auf die man passend reagieren muss.

Ich empfehle dir ein gutes Buch zur Unix-Programmierung. Z.B. http://www.kohala.com/start/apue.html. Sollte jede gute Uni-Bibliothek haben.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

macke_a

#6 Post by macke_a »

@Janka
Sorry, ich hatte den Text falsch interpretiert!

Ok, ich muss die beiden FiFo´s mit NONBLOCK setzen.

Ich werde es mal versuchen, ob sich dies mit meinem Programm verträgt!

Danke erstmal für die Rückantwort! Das Buch schaue ich mir ebenfalls jetzt mal an !

Gibt es eine andere alternative eine bidirektionale Kommunikation zwischen 2 Prozessen auf zubauen ?

Mfg macke_a

macke_a

#7 Post by macke_a »

Besteht denn nicht die Möglichkeit, zwei named pipes zu nutzen, ohne das die sich in die quere kommen?

Da ich nicht der beste BS Programmierer bin, suche ich eine einfache oder eine alternative Lösung um die Sache ans laufen zu bringen...

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#8 Post by Janka »

Die Named Pipes kommen sich nicht in die Quere. Dein Problem liegt höchstvermutlich (wenn du O_NONBLOCK nicht kennst) darin begründet, dass dein Programm jeweils im read() oder write() steht. Und wenn dann auf dieser Pipe keine Daten kommen bzw. keine mehr entgegengenommen werden können, blockiert das read() oder write() auf die eine Pipe, und Ereignisse auf der anderen Pipe werden dann halt nicht wahrgenommen.

Die schnelle alternative Lösung besteht darin, das nicht in C zu machen, sondern in einer Sprache, die eine Eventloop hat und das Lesen/Schreiben von Pipes intern erledigt.

Wozu soll das überhaupt gut sein?

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

macke_a

#9 Post by macke_a »

@janka
ich stell mal meinen Handler hier rein, den ich jede Sekunde aufrufe.

int len,x,z,lage;
int laenge,y = 0;
char PUFFER[256] = {0};
char REFPUFFER[256] = "FIRM";
char BUFFTEST[9] = "BUFFTEST";

void handler()
{
int size = 0;
//***********TEIL1 ANF ********************************//

if(x == 0) { fdgui = open("/tmp/guipipe",O_RDONLY);
x = 1; }

if(read(fdgui, PUFFER, 256 ) == -1)
{}
else {}

if(strcmp(REFPUFFER,PUFFER) == 0) { funktionvier(); }

//************TEIL1 END*********************************//
//************TEIL2 ANF*********************************//

if(y == 10)
{

laenge = strlen(BUFFTEST);
fdzse = open("/tmp/zsepipe",O_WRONLY);

if(fdzse == -1) { cssl_putdata(serial,"PIPE SHIT", 10); }
else { cssl_putdata(serial,"PIPE GOOD", 10); }

err3 = write(fdzse,BUFFTEST,laenge);

if(err3 != -1 )
{ cssl_putdata(serial, BUFFTEST, laenge);
}
else if (err3 == -1)
{ cssl_putdata(serial,"FIFO SHIT", 10);
}
else {}

y = 0;
}
y++;

//************TEIL2 END*********************************//

}

Also, wenn ich den ersten Teil ohne den zweiten Teil programmiere, funktioniert dieser Einwandfrei. Sobald ich den zweiten Teil mit laufen lasse, geht der ober Teil wiederum einwandfrei und der untere Teil sagt mir eine Fehlermeldung:
PIPE SHIT FIFO SHIT

Woran kann dies liegen!?

Noch mal zum Verständnis für mich:
Ich muss NONBLOCK verwenden, sonst funktioniert das überhaupt nicht mit den beiden FIFO`s richtig ???

Danke noch mal im Voraus für Deine Hilfe !!

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#10 Post by Janka »

fdzse = open("/tmp/zsepipe",O_WRONLY);
$ man 7 fifo
...
opening for write only will fail with ENXIO (no such device or address) unless the other end has already been opened.
...

Im allgemeinen ist es sinnvoll, im Fehlerfall errno zu prüfen und evtl. eine Medlung auszugeben (z.B. mit der Funktion perror()).

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

macke_a

#11 Post by macke_a »

HI !
Sag mal Janka, was hälst Du eigentlich von der Idee, die beiden Filedekriptoren mit select() zu programmieren?

Sprich da etwas gegen?

Mfg macke_a

Post Reply