Namedpipe receiver soll nicht auf Message warten
-
Hi Leute
Also wie schon in der überschrift soll mein Namedpipe receiver nicht warten, bis eine Message eintrudelt, da es sich um einen Port zum Fernsteuern einer 3D Engine handelt. Wenn ich fgets, fread oder so nutze zum auslesen, passiert genau das selbe, wie wenn ich eine Message schicke, wenn kein receiver dran hängt ( echo "Something" > Remote ) also er wartet
Hat irgendjemand eine Idee, wie ich das machen kann, ohne extra einen Thread für den Receiver zu erstellen?
Danke
p.s. der Code vom Receiver:
file = fopen(name.c_str(), "r"); if(file) { fgets(messageBuffer, MAX_NAMEDPIPE_BUFFER, file); printf("Received string: %s", messageBuffer); fclose(file); if( strlen(messageBuffer) ) { isBufferFilled = true; return true; } else { return false; } } else { return false; }
-
für das nicht blockierende lesen gibt es verschiedene Methoden. Siehe ua. select, pselect, poll
-
Mhhh - kannst du nach meinem Rewrite einen Fehler entdecken?
Bei open blockt er genauso, wie mit fopen, nur daß ich bei open eben O_NONBLOCK angegeben habe, was laut man page eigentlich nicht sein sollte. Für den Select Kram muß das fifo doch schon geöffnet sein oder?
int file = open(name.c_str(), O_RDONLY, O_NONBLOCK );
Erstellt wurde das fifo per
umask(0); //mknod(name.c_str(), S_IFIFO|0666, 0); // Alte version - sollte aber das selbe ergeben mkfifo(name.c_str(), 0666);
-
Also öffnen geht ohne Probleme, wenn ich Read&Write angebe, sonst blockt er ja da schon. Wenn ich danach per select teste, ob sich etwas verändert hat, kriege ich immer "Nope - ist nicht". Kann einer einen Fehler entdecken? Langsam macht mich das echt Wuschig, und ich bin am überlegen, ob ich nicht per Sockets fernsteuern soll. Dann bin ich den Block Ärger los. Warscheinlich währe diese Variante auch performanter.
int file = open(name.c_str(), O_RDWR, O_NONBLOCK ); if(file!=NULL) { fd_set fd; timeval tv; tv.tv_sec = 1; tv.tv_usec = 0; FD_ZERO(&fd); FD_SET(file, &fd); int i = select(1, &fd, NULL, NULL, &tv); if( i == - 1 ) { cout << "select doesn´t work" << endl; } else if( i == 0) { cout << "no data" << endl; close(file); return false; } cout << "open succeeded" << endl; int res = read(file, messageBuffer, MAX_NAMEDPIPE_BUFFER); //char *res = fgets(messageBuffer, MAX_NAMEDPIPE_BUFFER, file); close(file);