pipe auslesen
-
abend!
weiss jemand wie ich daten die per pipe an mein program geschickt werden auslesen kann (in C)? also:
unix: cat <somefile> | myprog
win/dos: type <somefile> | myprog.exewie komme ich an die daten von <somefile> dran? ich hab zwar was über die funcs popen() und pipe() gelesen, aber damit klappt es nicht.
hintergrund ist: ich möchte ein scanner für qmail schreiben, der bei jedem nachrichteneingang ausgeführt wird. und die mail wird ja per PIPE weitergegeben...
danke!
-
Meines wissens nach werden die Daten dir über stdin gegeben.
-
Du kannst die Pipe wie ein gewöhliches file nutzen.
Hier kannste etwas code von meinem Wrapper haben:Erstellen einer pipe, wenn sie noch nicht existiert:
/*! \fn UTILITY::NamedPipe::Create(const std::string n) */ void NamedPipe::Create(const std::string &name) { /// @todo implement windows port #ifdef __linux__ /* Create the FIFO if it does not exist */ umask(0); mknod(name.c_str(), S_IFIFO|0666, 0); this->name = name; #elif WIN32 #endif connected = true; }
Auslesen:
/*! \fn UTILITY::NamedPipe::HasMessage(void) */ bool NamedPipe::HasMessage(void) { /// @todo implement windows port #ifdef __linux__ 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; } #elif WIN32 #endif } /*! \fn UTILITY::NamedPipe::GetMessage(void) */ std::string NamedPipe::Get(void) { /// @todo implement windows port #ifdef __linux__ if( isBufferFilled ) { isBufferFilled = false; return std::string( messageBuffer ); } else { if( HasMessage() ) { isBufferFilled = false; return std::string( messageBuffer ); } else { return std::string(); } } #elif WIN32 #endif }
Hope this helps
-
omg, das sieht ja fast garnicht mehr nach C / C++ Code aus.