lesen aus einem named pipe in einer Schleife



  • Hallo 🙂

    Ich möchte mittels named pipes zwischen mehreren Prozessen kommunizieren. Dazu mal der reduzierte Code:

    #include <fcntl.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/stat.h>
    #include <unistd.h>
    
    #define MAX_BUF 1024
    
    int main()
    {
        int fd;
        char * myfifo = "printservers";
        char buf[MAX_BUF];
    
        /* open, read, and display the message from the FIFO */
        fd = open( myfifo, O_RDONLY );
        while( 1 )
    	{
    		if( read( fd, buf, MAX_BUF ) > 0 )
    			printf("Received: %s\n", buf);
    	}
        close(fd);
    
        return 0;
    }
    

    Dies ist mein "Drucker", der von verschiedenen Prozessen Druckeraufträge empfängt.

    #include <stdio.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    
    int get_line( char *dest, int size );
    
    #define MAX 1024
    
    void main ()
    {
    	char const *pipe = "printservers";
    	char buffer[MAX];
    	int fd;
    
    	get_line( buffer, MAX );
    
    	if( mkfifo( pipe, 0666 ) < 0 )
    	{
    		printf( "Cannot create a pipe\n" );
    		exit( EXIT_FAILURE );
    	}
    
    	fd = open( pipe, O_WRONLY );
    
    	write( fd, buffer, MAX );
    
    	close( fd );
    
    	//unlink( pipe );
    
    }
    
    int get_line( char *dest, int size )
    {
    	int c, i;
    	for( i = 0; i < size - 1 && ( c = getchar() ) != EOF && c != '\n'; ++i )
    		dest[i] = c;
    	if( c == '\n' )
    	{
    		dest[i] = c;
    		++i;
    	}
    	dest[i] = '\0';
    	return i;
    }
    

    Dies soll der Client sein, der dann Druckeraufträge in die Pipe schreibt.

    Das Problem: Wenn ich 1 Auftrag absende ( Ich entferne die Schleife ), dann funktioniert das Programm und gibt den Auftrag auf das Terminal aus. Doch mit der Schleife funktioniert das Programm nicht. Der 1 Auftrag wird ausgegeben, wenn ich jedoch einen 2. senden will, kommt auf dem 2. Terminal keine Ausgabe.
    Kann mir jemand erklären, warum das so ist und was ich dagen machen kann?

    Danke schonmal 🙂



  • named_pipe schrieb:

    Das Problem: Wenn ich 1 Auftrag absende ( Ich entferne die Schleife ), dann funktioniert das Programm und gibt den Auftrag auf das Terminal aus. Doch mit der Schleife funktioniert das Programm nicht. Der 1 Auftrag wird ausgegeben, wenn ich jedoch einen 2. senden will, kommt auf dem 2. Terminal keine Ausgabe.

    Kann ich nicht nachvollziehen. Wenn ich eine Schleife einbaue

    int main (void)
    {
        char const *pipe = "printservers";
        char buffer[MAX];
        int fd;
    
        if( mkfifo( pipe, 0666 ) < 0 )
        {
            printf( "Cannot create a pipe\n" );
            exit( EXIT_FAILURE );
        }
    
        fd = open( pipe, O_WRONLY );
        while(strncmp(buffer, "exit", 4)!=0){
          get_line( buffer, MAX );
          write( fd, buffer, MAX );
        }
        close( fd );
    
        unlink( pipe );
    }
    

    tut das.



  • Sorry, das war wohl etwas überstürzt gestern.
    Ich habe überhaupt nicht geblickt, welche Schleife Du meinst.

    Denkst Du nicht auch, dass es sinnvoll ist, einen Server zu schreiben, der einen FIFO anbietet, an den sich clients jederzeit connecten koennen, anstatt das ein Client einen FIFO öffnet, an den sich der Server hängt?

    Ich würde es mal so herum versuchen, das entspricht jedenfalls eher meinem Verständnis.

    Was auf jeden Fall nicht klappt, ist das mehrmalige erstellen des gleichnamigen FIFO ("file exists").


Anmelden zum Antworten