array in einem Struct durch die Pipe schieben



  • Hey,
    habe einen Fork Baum mit 1 Vater und 2 Kindern. Zwischen den Kindern ist eine Piepe durch die ein Array aus einem Struct geschoben werden soll. Leider kommen bei 2 die werte nicht so an wie sie erzeugt wurden.

    Hat jemand ne Idee?
    Desweiteren wollte ich mal fragen, ob Ihr mir einen Tip geben wie ich vom Stil her besser lesbar werde? Thanx

    [code]

    //Bibliotheken
    #include <stdio.h>
    #include <pthread.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/syscall.h>
    #include <math.h>
    #include <time.h>
    #include<signal.h>
    #include <sys/types.h>
    #include <sys/wait.h>

    struct Zahl{int array[10];};

    int main()
    {
    //Erzeugung Deskriptorem
    int deskr1[2];

    //Strukturvariable erstellen
    struct Zahl Zahlen;

    // Pipe erstellen mit Fehlerbehandlung
    int Fehler1 = pipe(deskr1);
    if(Fehler1<0)
    {
    printf("Die Pipe 1 konnte nicht erstellt werden!\n");
    exit(1);
    }

    int prozess2=fork(); //Prozess 2 wird erzeugt
    if(prozess2==0)
    {
    printf("[PID: %d PPID: %d] Ich bin Prozess #2 \n", getpid(), getppid() );
    close(deskr1[1]);

    int j;
    for( j=1;j<=10;j++)
    {
    read(deskr1[0],&Zahlen,sizeof(struct Zahl)); //Lesen aus der Pipe (von P3)
    printf("[PID: %d PPID: %d]Empfangen <-- :%i \n",getpid(), getppid(), Zahlen.array[j]);
    }
    close(deskr1[0]);
    }
    else if(prozess2>0)
    {
    printf("[PID: %d PPID: %d] Ich bin Prozess #1 (Vater)\n", getpid(), getppid() );

    int prozess3=fork(); //Prozess 3 wird erzeugt
    waitpid(prozess2, NULL, 0);
    if(prozess3==0)
    {
    printf("[PID: %d PPID: %d] Ich bin Prozess #3 \n", getpid(), getppid() );
    close(deskr1[0]); //Lesen schließen
    int i;
    for(i=0;i<=9;i++)
    {
    Zahlen.array[i] = random() %10; //Erzeugung von Zufallsvariablen
    //printf("[PID: %d PPID: %d]Zufallszahl :%i\n",getpid(), getppid(), zufallsarray[i]); //Ausgabe Gesendetes als Test
    write(deskr1[1],&Zahlen,sizeof(struct Zahl)); //Schreiben in die Pipe (nach P2)
    printf("[PID: %d PPID: %d]Gesendet --> :%i\n",getpid(), getppid(), Zahlen.array[i]);
    }
    close(deskr1[1]); //Schreiben nach dem Schreiben schließen
    }
    else if(prozess3>0)
    {
    //printf("[PID: %d PPID: %d] Ich bin der Vater von Prozess #3 \n", getpid(), getppid() );
    waitpid(prozess3, NULL, 0);
    }
    else
    {
    printf("[PID: %d PPID: %d] Fehler beim Erzeugen von Prozess #3\n", getpid(), getppid() );
    }
    }
    else
    {
    printf("[PID: %d PPID: %d] Fehler beim Erzeugen von Prozess #2\n", getpid(), getppid() );
    }

    return 0;
    }

    Ausgabe:

    [PID: 2937 PPID: 2399] Ich bin Prozess #1 (Vater)
    [PID: 2938 PPID: 2937] Ich bin Prozess #2
    [PID: 2939 PPID: 2937] Ich bin Prozess #3
    [PID: 2939 PPID: 2937]Gesendet --> :3
    [PID: 2939 PPID: 2937]Gesendet --> :6
    [PID: 2939 PPID: 2937]Gesendet --> :7
    [PID: 2939 PPID: 2937]Gesendet --> :5
    [PID: 2939 PPID: 2937]Gesendet --> :3
    [PID: 2939 PPID: 2937]Gesendet --> :5
    [PID: 2939 PPID: 2937]Gesendet --> :6
    [PID: 2939 PPID: 2937]Gesendet --> :2
    [PID: 2939 PPID: 2937]Gesendet --> :9
    [PID: 2939 PPID: 2937]Gesendet --> :1
    [PID: 2938 PPID: 2937]Empfangen <-- :32767
    [PID: 2938 PPID: 2937]Empfangen <-- :787461960
    [PID: 2938 PPID: 2937]Empfangen <-- :32618
    [PID: 2938 PPID: 2937]Empfangen <-- :0
    [PID: 2938 PPID: 2937]Empfangen <-- :0
    [PID: 2938 PPID: 2937]Empfangen <-- :4197168
    [PID: 2938 PPID: 2937]Empfangen <-- :0
    [PID: 2938 PPID: 2937]Empfangen <-- :0
    [PID: 2938 PPID: 2937]Empfangen <-- :0
    [PID: 2938 PPID: 2937]Empfangen <-- :4196035



  • Du hast korrekterweise versucht, das code-tag zu verwenden. Du hast aber offensichtlich nicht die Vorschau verwendet. Wenn Du was geschrieben hast, schau Dir die Vorschau an, ob das das für den Leser zumutbar ist. So macht es kein Spaß zu lesen.

    Was mir spontan so auffällt solltest Du den Rückgabewert von read immer auswerten.


Anmelden zum Antworten