Named Pipes Probleme

M

macke_a

Mitglied
Hallo!

Ich versuche seit ein paar Tagen vergeblich ein Pipe zwischen zwei Prozessen aufzubauen. Das Problem ist, dass ich eine unidirektionale Verbindung zu 100% hin bekomme, nur eine bidirektionale nicht!

Ich habe jeder PIPE einen unterschiedlichen Namen zugeteilt. Sobald ich jetzt die Daten von Prozess1 nach Prozess2 schreibe und wieder von Prozess2 nach Prozess1 zurück schreibe, läuft mein Programm nicht mehr!

Meine Sende PIPE:

main()
{
int ein;
int hilf;
char outbuffer[2];
int fd;
int lese;

do
{
fd = open("MY_PIPE",O_RDONLY);
if (fd==-1)

sleep(2);
} while (fd==-1);
while(1)
{
lese=read(fd,outbuffer,2);
if (lese==0) break;

// Hier verwende ich meine outbuffer weiter

sleep(2);
}
unlink("MY_PIPE");
return 0;
}


Meine Empfangs PIPE:

main()
{
int ein;
int hilf;
char inbuffer[2];
int fd;

mkfifo("MY_PIPE",0666);
fd = open("MY_PIPE",O_WRONLY);

for(hilf=0;hilf<10;hilf++)
{
inbuffer[0]=48+hilf;
write(fd,inbuffer,2);

// Hier verwende ich meinen inbuffer

sleep(1);
}
return 0;
}


So jetzt habe ich jeweils in einem Prozess diesen Sende- und Empfangs- Buffer, die PIPE NAMEN habe ich dementsprechend angepaßt!

Kann mir jemand weiter helfen ??
Das wäre echt toll!

Danke schon mal im Voraus!!

Mfg macke_a
 
ich habe schon lange nicht mehr mit named pipes gearbytet, doch glaube ich mich zu erinnern dass named pipes nur in eine richtung geht. wie währe es zu versuchen eine zweite pipe als rückkanal ein zu richten?
 
Korrekt "named pipes" gehen nur in eine Richtung!
Deswegen habe versucht eine weitere unabhängige Pipe durch den unterschiedlichen PIPE NAMEN aufzubauen.

Dies sollte doch funktionieren...
 
ok was meinst du mit ".., läuft mein Programm nicht mehr!.." eventuell deadlock?
 
Ein Deadlock entsteht, wenn mehrere Prozesse sich gegenseitig so beeinflussen das keiner von ihnen in der Lage ist seine Aufgabe bis zum Ende auszuführen!

Darüber hab ich auch schon nachgedacht ! Ich habe die Pipe nach Beendigung des Schreib- und Lesevorgangs mit einem close() explizit abgeschlossen. Dies müsste eigentlich ausreichend sein um den Deadlock zu verhindern !

Mein Programm hängt sich auf! Erst durch einen Reset kann ich den Urzustand wieder bekommen...
 
ok
1. welches programm hängt sich auf sender/empfäner/beide?
2. RESET? meinst du jezt einen ECHTEN HW reset (was sagt "kill")?
3. prüfe ob wirklich close ausgeführt wird!

auch kann ein zu frühes close zum datenverlust in der pipe führen oder schlimmeres(deadlock).
 
zu 1) Prozess 1 sendet an Prozess 2, danach sendet Prozess 2 nach Prozess 1. Das Programm hängt sich auf wenn Prozess 2 nach Prozess 1 sendet. Ich will eine Halbduplexverbindung aufbauen.

zu 2) Einen echten HW muss ich ausführen !

zu 3) wie soll ich das mit dem close() überprüfen ? close befindet sich immer am Ende des Programms über sleep!

Anscheinend kennst Du dich mit dem Thema aus. Ich habe schon viel über fork() gelesen, Vater - Kind Prozess.
Wäre das ne bessere "Vollduplex - Lösung" ?
 
wirklich auskennen tuh ich mich damit nicht :(
ja named pipes sind wohl die schlechteste idee sowas um zu setzen.
ich würde dass eher mit IP machen, schöner nebeneffekt es ist gleich netzwerkfähig!
 
Naja ich bin auch mehr der Leie...

Vielleicht hat jemand anders nen Lösungsansatz..!
 

Ähnliche Themen

Unix Webserver mit HTML Seite erstellen

Prozesskommunikation mit PIPES - wie funktioniert das?

Ausführbare C-Datei von Mac OS auf Embedded Linux ausführen

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

Displayport + externer Monitor zeigt bei startx nichts erst bei DVI

Zurück
Oben