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.exe

    wie 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. 🤡


Anmelden zum Antworten