Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
2 Named Pipe in einem Prozess verwenden

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Programmieren - Allgemein
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
macke_a
Gast





BeitragVerfasst am: 10. Jul 2007 17:31   Titel: 2 Named Pipe in einem Prozess verwenden

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
 

Janka



Anmeldungsdatum: 11.02.2006
Beiträge: 3569

BeitragVerfasst am: 10. Jul 2007 21:05   Titel:

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.
 
Benutzer-Profile anzeigen Private Nachricht senden

macke_a
Gast





BeitragVerfasst am: 11. Jul 2007 7:35   Titel:

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
Gast





BeitragVerfasst am: 11. Jul 2007 7:50   Titel:

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?
 

Janka



Anmeldungsdatum: 11.02.2006
Beiträge: 3569

BeitragVerfasst am: 11. Jul 2007 9:59   Titel:

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.
 
Benutzer-Profile anzeigen Private Nachricht senden

macke_a
Gast





BeitragVerfasst am: 11. Jul 2007 10:07   Titel:

@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
Gast





BeitragVerfasst am: 11. Jul 2007 10:33   Titel:

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...
 

Janka



Anmeldungsdatum: 11.02.2006
Beiträge: 3569

BeitragVerfasst am: 11. Jul 2007 13:16   Titel:

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.
 
Benutzer-Profile anzeigen Private Nachricht senden

macke_a
Gast





BeitragVerfasst am: 11. Jul 2007 13:31   Titel:

@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 !!
 

Janka



Anmeldungsdatum: 11.02.2006
Beiträge: 3569

BeitragVerfasst am: 11. Jul 2007 18:27   Titel:

Zitat:
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.
 
Benutzer-Profile anzeigen Private Nachricht senden

macke_a
Gast





BeitragVerfasst am: 11. Jul 2007 19:17   Titel:

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
 

Beiträge vom vorherigen Thema anzeigen:   
     Pro-Linux Foren-Übersicht -> Programmieren - Allgemein Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy