nntp2http.com
Posting
Suche
Optionen
Hilfe & Kontakt

In Named Pipe schreiben ohne SIGPIPE auszulösen.

Von: Jan Kandziora (jjj@gmx.de) [Profil]
Datum: 12.01.2009 14:33
Message-ID: <gkfgrn$7ke$1@online.de>
Newsgroup: de.comp.os.unix.programming
Hallo,

ich steh' vermutlich einfach auf dem Schlauch. Folgende Umstände:

Für einen Touchscreen existiert ein selbstgemachtes XInput-Treibermodul. Zur
Kalibrierung dient ein selbstgemachtes Programm, das genau wie der Treiber
die Rohdaten vom per RS232 angebundenen Controller lesen muss.

Soweit, so gut. Nun kann aber natürlich immer nur ein Prozess die serielle
Schnittstelle kontrollieren. Das ist während der ganzen Zeit der Treiber.
Für das Kalibrierprogramm würde es jedoch auch ausreichen, nur
"mitlesen"
zu können. Daher will ich eine Named Pipe einrichten, in die der Treiber
die vom Controller gelesenen Daten einfach nur abkippt. Das
Kalibrierprogramm soll sie dort abholen.

Nun das Problem: Wie erreiche ich zuverlässig, dass beim Schließen der Named
Pipe durch das Kalibrierprogramm der Treiber *kein SIGPIPE* erhält? Ich
möchte das Signal ungern einfach ignorieren, da der Treiber ja nur ein
einzelnes Modul von X ist und ich nicht weiß, wie die anderen Programmteile
auf das SIGPIPE bzw. auf das Fehlen von SIGPIPE reagieren.

Ich habe schon versucht, mittels select() herauszufinden, ob der
Dateideskriptor geschrieben werden kann. select() liefert jedoch
grundsätzlich 0 zurück, wenn ich es auf die zuvor erfolgreich geöffnete
Named Pipe anwende, egal ob ein anderer Prozess daran horcht oder nicht.



Funktionierende Testcode mit signal():

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <signal.h>

const char *buf = "BLA";

#define FD_INVALID -1

int main(void)
{
int     fdý_INVALID;
ssize_t count;

signal(SIGPIPE, SIG_IGN);

while (1)
{
if (fd == FD_INVALID)
{
if ((fd=open("xfifo", O_WRONLY|O_NONBLOCK)) < 0)
{
if (errno == ENXIO) goto end;

perror("open");
exit(EXIT_FAILURE);
}
}

if ((count=write(fd, buf, sizeof(buf)-1)) < 0)
{
if (errno == EPIPE)
{
close(fd);
fdý_INVALID;
}
else
{
perror("write");
exit(EXIT_FAILURE);
}
}

end:
fprintf(stderr,".");
usleep(100000);
}

return 0;
}

Die Gegenseite ist einfach "cat xfifo"


Vielleicht hat ja jemand von euch eine Idee.

Mit freundlichem Gruß

Jan


[ Auf dieses Posting antworten ]

Antworten