Select oder Poll auf named pipe will nicht...



  • Hiho,

    ich versuche gerade mittels FiFo/Named Pipe mit einer Anwendung zu sprechen.
    Dazu will ich vermeiden innerhalb des Programms selbst 'manuell' pollen zu müssen - ich verwende also select() oder auch poll() - nur leider will das nicht so wie es soll.
    Ein strace zeigt mir, dass der Ablauf beim open() des FiFos blockiert wird solange bis die ersten Daten dort ankommen - danach gibt ein select oder poll scheinbar _immer_ true zurück und meint da wäre noch mehr zu lesen.

    Daten schiebe ich momentan einfach per echo "text" > fifo rein.

    Der entsprechende Code dazu (hier mit poll):

    char rbuffer[1024];
            int fd, n;
            fd_set rfds;
            struct pollfd pf;
    
            fd=open("fifo", O_RDONLY, 0);
            if(fd == -1) {
                    perror("fifo failed ");
                    exit(-1);
            }
    
            for(;;) {
                    pf.fd = fd;
                    pf.events = POLLIN;
                    if (poll(&pf, fd+1, 100000)) {
                            if( n = read(fd, fpuffer, 1024) ) {
                                    printf("%s", fpuffer);
                            }
                    } else
                            perror("fifo error");
            }
    

    Ich habe dasselbe auch mit select versucht und setze auch brav das struct und den Timeout innerhalb der Schleife bei jedem Durchgang zurück... gleiches Ergebnis:
    Das Programm blockiert bis zu den ersten Daten und dann wird einfach angenommen, es kämen immer mehr hinterher, auch wenn das read immer mit 0 Bytes zurückkehrt.

    Irgendwie versteh ich den Fehler nicht so ganz.....



  • Wenn Du die Pipe zum lesen öffnest, blockiert der open so lange, bis ein anderer Prozess sie zum Schreiben öffnet. Lösung dafür ist O_NONBLOCK als Flag beim open mit anzugeben, damit er nicht blockiert (imho macht select auch erst bei non-blocking Operations wirklich Sinn).

    Das zweite Problem was Du hast ist dass nach dem Schreiben auf die Pipe via echo, diese wieder geschlossen wird. Das sieht am lesenden Ende wie ein EOF (end-of-file) aus, und das äussert sich darin dass select Dir sagt es gäbe was zu lesen, und read Dir sagt es wurden 0 Byte gelesen. Wenn Du eine dauerhafte Kommunikation zwischen zwei Prozessen willst, solltest Du die schreibende Seite also offen lassen, bis es nichts mehr zu schreiben gibt.



  • Das wird nicht gehen, da es notwendig ist die Daten per echo Command auf der Shell eingeben zu können.
    Ich hab es jetzt erstmal so 'gelöst' dass die pipe bei jedem Input geschlossen und neu geöffnet wird... sicherlich nicht das Tollste.. da die Inputs aber nicht im Millisekunden-Abstand sondern eher innerhalb von Minuten kommen, denke ich mal ist das noch brauchbar...


Anmelden zum Antworten