Pro-Linux.de

Pro-Linux

Pro-Linux Diskussions- und Hilfeforum
Aktuelle Zeit: 19. Nov 2018 16:16

Alle Zeiten sind UTC+01:00




Ein neues Thema erstellen  Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
BeitragVerfasst: 10. Jul 2007 17:31 
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


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 10. Jul 2007 21:05 
Offline
Benutzeravatar

Registriert: 11. Feb 2006 19:10
Beiträge: 3569
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.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 11. Jul 2007 7:35 
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!


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 11. Jul 2007 7:50 
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?


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 11. Jul 2007 9:59 
Offline
Benutzeravatar

Registriert: 11. Feb 2006 19:10
Beiträge: 3569
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.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 11. Jul 2007 10:07 
@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


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 11. Jul 2007 10:33 
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...


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 11. Jul 2007 13:16 
Offline
Benutzeravatar

Registriert: 11. Feb 2006 19:10
Beiträge: 3569
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.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 11. Jul 2007 13:31 
@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 !!


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 11. Jul 2007 18:27 
Offline
Benutzeravatar

Registriert: 11. Feb 2006 19:10
Beiträge: 3569
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.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 11. Jul 2007 19:17 
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


Nach oben
   
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen  Auf das Thema antworten  [ 11 Beiträge ] 

Alle Zeiten sind UTC+01:00


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.
Sie dürfen keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Limited
Deutsche Übersetzung durch phpBB.de