Probleme beim Auslesen der Daten aus der Pipe



  • Bin echt überfragt, da ich es genauso anwende wie wir es in der Vorlseung behandelt haben. Allerdings ist die Ausgabe "Im textbuffer steht: " leer.
    Sieht jemand woran das liegen könnte?

    #include <ctype.h>
    #include <sys/wait.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    
    int main() {
        int fehler,stat2,stat3;
        pid_t pid2,pid3;
    
        char textbuffer[50];
        int deskr[2];
        fehler=pipe(deskr);
        if (fehler==-1)
            printf("Fehler");
    
        pid2=fork();
    
        if (pid2<0)
            printf("Fehler");
    
        if (pid2==0) {
            printf("[PID: %d , PPID: %d]   geschrieben \n" , getpid(), getppid());
            close(deskr[0]);
            write(deskr[1],"helloWorld",10);
            printf("[PID: %d , PPID: %d]   geschrieben \n" , getpid(), getppid());
            close (deskr[1]);
            exit(123);
        }
        if (pid2>0) {
            printf("[PID: %d , PPID: %d]   p1 \n" , getpid(), getppid());
            pid3=fork();
            close(deskr[0]);
            close(deskr[1]);
            waitpid(pid2,&stat2,0);
            waitpid(pid3,&stat3,0);
    
            if (pid3<0)
                printf("Error");
    
            //prozess 3
            if (pid3==0) {
                close(deskr[1]);
                printf("[PID: %d , PPID: %d]   P3 geht schlafen \n" , getpid(), getppid());
                sleep(2);
                printf("[PID: %d , PPID: %d]   P3 wacht auf \n" , getpid(), getppid());
                read(deskr[0],textbuffer,10);
                printf("Im textbuffer steht:%s",textbuffer);
    
                close(deskr[0]);
                exit(213);
            }
        }
        return 0;
    }
    

    edit by nman: Code wegen unlesbarer Einrückung durch astyle durchgejagt.



  • Bitte gebe dir etwas Mühe mit der Codeeinrückung, das ist ja unerträglich so.

    Zum Fehler: Was denkst du, wird

    close(deskr[0]);
    read(deskr[0],textbuffer,10);
    

    funktionieren? Nein? Dann schau nochmal nach, was dein Code genau macht.



  • Naja der diskriptor wird doch geschlossen nachdem der fork() aufruf ist. Also müsste das Kind beide Deskriptoren geerbt haben oder nicht?



  • Juleian* schrieb:

    Naja der diskriptor wird doch geschlossen nachdem der fork() aufruf ist. Also müsste das Kind beide Deskriptoren geerbt haben oder nicht?

    Lies bitte die man: fork(2)-Manpage nochmal.



  • Oh, btw: Wenn du "helloWorld" auf einmal schreiben und lesen möchtest, schreibst/liest du mit 10 Zeichen genau eines zu wenig (das '\0' am Ende fehlt dir sonst).


Anmelden zum Antworten