pip für struct in C



  • Guten Tag,
    Ich beschäftige mich gerade mit dem Programmieren einer pipe, genauer gesagt geht es um eine Struktur, die über eine Pipe an einen anderen Prozess übergeben wird.
    Also hier der Quellcode:

    #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>

    #define READ 0
    #define WRITE 1

    main()
    {
    int pid;
    int i;
    int k=10;
    int pipe[2];
    struct Zahlen
    {
    int z1;
    float z2;
    };

    pid=fork();

    if (pid>0)
    {
    struct tm *newtime;
    time_t long_time;
    time( &long_time );
    newtime = localtime( &long_time );
    printf("Uhrzeit = %d:%d:%d\n", newtime->tm_hour, newtime->tm_min, newtime->tm_sec);
    printf("PID: %d,PPID: %d\n",getpid(), getppid());
    }

    if (pid==0)
    {

    pid=fork();

    if (pid>0)
    {
    for (i=0;i<11;i++)
    {
    usleep(1000000);
    printf("%d\n",k);
    k--;
    }
    printf("PID: %d,PPID: %d\n",getpid(), getppid());
    wait((int*)1);
    wait((int*)2);
    wait((int*)3);
    }

    if (pid==0)
    {
    struct Zahlen a;
    a.z1=rand() % (20-10+1)+0;
    a.z2=rand() % (20-10+1)+0;

    write (pipe[WRITE],&a,sizeof ((struct Zahlen) a)); !!!!!!!!!!!
    close (pipe[WRITE]);
    printf("%d\n",a.z1);
    printf("PID: %d,PPID: %d\n",getpid(), getppid());
    exit(1);
    }

    pid=fork();

    if (pid==0)
    {
    system( "ps");
    printf("PID: %d,PPID: %d\n",getpid(), getppid());
    exit(2);
    }

    pid=fork();

    if (pid==0)
    {
    int b;
    struct Zahlen c;
    read (pipe[READ],&c,sizeof ((struct Zahlen) c)); !!!!!!!!!!!!!!!!!!!
    close (pipe[READ]);
    //b=a.z1+a.z2;
    printf("%d\n",c.z1);
    printf("%d\n",b);
    printf("PID: %d,PPID: %d\n",getpid(), getppid());
    exit(3);
    }
    }
    return 0;
    }

    Die relevanten Prozesse habe ich mit einem Ausrufezeichen markiert.
    Hier ist nun die Ausgabe.

    pipes.c:14: warning: return type defaults to ‘int’
    pipes.c: In function ‘main’:
    pipes.c:89: warning: ‘b’ may be used uninitialized in this function

    6
    PID: 1940,PPID: 1939
    Uhrzeit = 21:44:46
    PID: 1938,PPID: 1912
    10
    9
    8
    7
    6
    5
    4
    3
    2
    1
    0
    PID: 1939,PPID: 1
    0 !!!!!!!!!!!!!!!
    0
    PID: 1942,PPID: 1
    PID TTY TIME CMD
    1912 pts/0 00:00:00 bash
    1941 pts/0 00:00:00 pipes.c
    1943 pts/0 00:00:00 sh
    1944 pts/0 00:00:00 ps
    PID: 1941,PPID: 1

    Warum ist die Ausgabe bei 0 und nicht bei 6?
    Was funktioniert an der pipe nicht?
    Viele Prozesse geben als ppid 1 an, was kann man tun (beachten), dass die echte PPID ausgegeben wird? Ich meine damit nicht einfach am Anfang des Prozesses ppid=getppid() und in der jeweiligen Ausgabefunktion ppid statt gettppid.
    Wie gesagt, das Hauptproblem ist aber die pipe für eine struct. Zu beachten ist auch, dass sich in struc eine int und eine floatzahl verstecken.
    Über Rückmeldungen wäre ich sehr dankbar.



  • Hier nochmal die Aufgabenstellung:

    Erstellen Sie ein C-Programm, dass den unten stehenden fork()-Baum
    inklusive Pipe erzeugt. Alle Prozesse arbeiten parallel.
    • Geben Sie zu jeder Textausgabe die PID/PPID des Prozesses in folgender
    Form aus:
    [PID: 3128, PPID: 3127] <Text>
    • Schließen Sie unbenutzte Deskriptoren der Pipes!!
    • Alle Prozesse warten nach getaner Arbeit auf die Terminierung ihre Kinder.
    • Implementieren Sie geeignete Fehlerbehandlungen.
    • Der Prozess P1 gibt die aktuelle Uhrzeit sowie die PID seines Kindprozesses
    aus.
    • Der Prozess P2 zählt einen 10 Sekunden Countdown. (usleep() verwenden –
    höhere Genauigkeit)
    • Der Prozess P3 erzeugt zwei Zufallszahlen (1x int, 1x float) legt diese in
    eine Struktur ab und leitet die Struktur-Variable über eine Pipe an P5 zur
    Ausgabe weiter.
    • P5 addiert die beiden Werte und gibt sie aus.
    • Der Prozess P4 startet das Programm ps und gibt eine aktuelle Prozessliste
    aus. Verwenden Sie dazu die Funktion system(). Siehe man-Page.
    • Dokumentieren Sie das Programm hinreichend.

    fork()
    1
    /
    2
    / / /
    3 4 5
    ---->
    pipe()

    Ich hab inzwischen rausgefunden, dass Strukturen wohl mit msgnd und msgrcv verarbeitet werden sollten anstatt mit write, close und read. Trotdem ist das Problem noch nicht gelöst!! Kennt jemand einen Quelltext der das Problem löst?
    Hier ein Vorschlag: http://www.dropnet.ch/aktuell/bibliothek/unix_guru/node395.html
    ?


Anmelden zum Antworten