hell-student
Lieutenant
- Registriert
- Nov. 2007
- Beiträge
- 671
Hallo Zusammen,
Ich bräuchte mal eure Hilfe. Ich habe zwei Prozesse A und B. A schreibt per WRITE in die Named Pipe. B ließt per READ von der Named Pipe:
B argiert hier als Server und reagiert auf eintreffende Nachrichten. Die Nachrichten bestehen aus Zeichenketten, die die einzelnen Informationen enthalten:
A agiert als Client und schreibt Zeichenketten in die Named Pipe:
Das Zeichen "_" dient mir als Trennzeichen um auf der Serverseite die Nachricht in ihre Bestandteile zu zerlegen.
Was ich nun leider feststellen musste ist, dass wenn ich zu schnell zu viele Nachriten über die Pipe übermittle, diese irgendwann voll wird und ich keine weiteren Nachrichten mehr senden kann. Warum wird die Pipe aber voll. Wird per Read nicht der Inhalt der Pipe ausgelesen, d.h ist nicht mehr in der Pipe vorhanden.
Ich habe dazu einfach mal eine FOR-Schleife verwendet und jede Sekunde eine Nachricht gesendet. Irgendwann wird die Named Pipe voll.
Per cat < pipe habe ich den ganzen Inhalt darin sehen können.
Mache ich hier was falsch? Gibt es eine Alternative zu read(): Zudem wäre mit lieber noch die Größe der Nachricht mit zu übermitteln und nur genausoviele Zeichen aus zu lesen.
Falls ihr noch weitere Informationen benötigt, einfach melden.
Das ganze läuft unter Linux auf einem FPGA Board. Kernel ist glaube ich 3.5
Danke
EDIT:
Der Server öffnet die Pipe so:
Der Client so:
Ich bräuchte mal eure Hilfe. Ich habe zwei Prozesse A und B. A schreibt per WRITE in die Named Pipe. B ließt per READ von der Named Pipe:
B argiert hier als Server und reagiert auf eintreffende Nachrichten. Die Nachrichten bestehen aus Zeichenketten, die die einzelnen Informationen enthalten:
Code:
char msg[MSG_PACKET_SIZE] = "";
while (true) {
if (read(tlnp_fd, msg, MSG_PACKET_SIZE) > 0) {
arbeite_mit_der_nachricht_funktion(msg);
}
}
A agiert als Client und schreibt Zeichenketten in die Named Pipe:
Code:
char msg[MSG_PACKET_SIZE] = "";
sprintf(msg, "4_%i_%i_%i_%i_%i", id, s_id, priority, restart, no_f);
if (write(tlnp_fd, msg, MSG_PACKET_SIZE) < 0) {
perror("Write to NP failed");
}
Das Zeichen "_" dient mir als Trennzeichen um auf der Serverseite die Nachricht in ihre Bestandteile zu zerlegen.
Was ich nun leider feststellen musste ist, dass wenn ich zu schnell zu viele Nachriten über die Pipe übermittle, diese irgendwann voll wird und ich keine weiteren Nachrichten mehr senden kann. Warum wird die Pipe aber voll. Wird per Read nicht der Inhalt der Pipe ausgelesen, d.h ist nicht mehr in der Pipe vorhanden.
Ich habe dazu einfach mal eine FOR-Schleife verwendet und jede Sekunde eine Nachricht gesendet. Irgendwann wird die Named Pipe voll.
Per cat < pipe habe ich den ganzen Inhalt darin sehen können.
Mache ich hier was falsch? Gibt es eine Alternative zu read(): Zudem wäre mit lieber noch die Größe der Nachricht mit zu übermitteln und nur genausoviele Zeichen aus zu lesen.
Falls ihr noch weitere Informationen benötigt, einfach melden.
Das ganze läuft unter Linux auf einem FPGA Board. Kernel ist glaube ich 3.5
Danke
EDIT:
Der Server öffnet die Pipe so:
Code:
if ((tlnp_fd = open(tlnp, O_RDONLY)) < 0) {
perror("open() error");
}
Der Client so:
Code:
if ((tlnp_fd = open(tlnp, O_WRONLY | O_NONBLOCK)) < 0) {
perror("open_tlnp() error");
}
Zuletzt bearbeitet: