Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <unistd.h>
- typedef struct
- {
- char Name[20];
- char Vorname[20];
- long Matrikel_Nr;
- int Note;
- } ZETTEL, *ZULASSUNG;
- /************************************************************/
- /* */
- /* Erzeugen dreier paralleler Prozesse, die über pipes */
- /* kommunizieren: */
- /* */
- /* SEKRETARIAT ---------> PRÜFER --------->PRÜFUNGSAMT */
- /* PIPE_1 PIPE_2 */
- /* */
- /************************************************************/
- void Sekretariat(int), Pruefer(int,int), Pruefungsamt(int);
- int counter = 0;
- main()
- {
- int Pipe_1[2], Pipe_2[2]; /* pipe-Deskriptoren */
- int Status_1, Status_2, stat;
- int pid1, pid2, pid3;
- Status_1 = pipe(Pipe_1); /* Erzeugen der pipes */
- Status_2 = pipe(Pipe_2);
- if ((Status_1 == -1) || (Status_2 == -1)) /* pipe() liefert */
- printf("\n!!! kann pipe nicht erzeugen\n"); /* im Fehlerfall-1*/
- else
- if ((pid1=fork()) == 0) /* nicht Vater */
- {
- if ((pid2=fork()) == 0) /* Enkel */
- {
- close (Pipe_1[0]); /* darf in Pipe_1 nicht lesen */
- close (Pipe_2[0]); /* darf in Pipe_2 nicht lesen */
- close (Pipe_2[1]); /* darf in Pipe_2 nicht schreiben */
- Sekretariat(Pipe_1[1]);
- }
- else /* erstes Kind */
- {
- waitpid(pid3, &stat, 0);
- close(Pipe_1[1]); /* darf in Pipe_1 nicht schreiben */
- close(Pipe_2[0]); /* darf in Pipe_2 nicht lesen */
- Pruefer(Pipe_1[0], Pipe_2[1]);
- }
- }
- else
- {
- //waitpid(pid1, &stat, 0);
- if ((pid3=fork()) == 0) /* zweites Kind */
- {
- waitpid(pid2, &stat, 0);
- close(Pipe_1[0]); /* darf in Pipe_1 nicht lesen */
- close(Pipe_1[1]); /* darf in Pipe_1 nicht schreiben */
- close(Pipe_2[1]); /* darf in Pipe_2 nicht schreiben */
- Pruefungsamt(Pipe_2[0]);
- }
- close(Pipe_1[0]);
- close(Pipe_1[1]);
- close(Pipe_2[0]);
- close(Pipe_2[1]);
- waitpid(pid1, &stat, 0);
- /* der Vaterprozess stirbt nach Erzeugen der Kind- */
- /* prozesse, dabei wird implizit für jeden */
- /* seiner pipe-Deskriptoren 'close' aufgerufen. */
- Lösung zu Übung 2 von Manuel Grüner, Tino Mohr Stefan Friedl, Christian Zorneck
- }
- }
- void Sekretariat(int Pipe_PRUE)
- {
- /* liest mittels "scanf()" die Zulassungszettel */
- /* (Name, Vorname, Matrikelnummer) ein und schreibt */
- /* sie in die Pipe mit Deskriptor Pipe_PRUE. */
- ZETTEL zulassung;
- int stat;
- do { //datensaetze einlesen
- stat = scanf("%s", zulassung.Name);
- stat = scanf("%s", zulassung.Vorname);
- stat = scanf("%d", &zulassung.Matrikel_Nr);
- if(stat!=EOF)
- write(Pipe_PRUE, &zulassung, sizeof(ZETTEL));
- }while(stat !=EOF);
- }
- void Pruefer(int Pipe_SEKR, int Pipe_AMT)
- {
- /* liest Zulassungszettel aus der pipe Pipe_PRUE,*/
- /* trägt eine Note ein und schreibt die Zettel */
- /* in die pipe Pipe_AMT. */
- ZETTEL zulassung;
- while(read(Pipe_SEKR, &zulassung, sizeof(ZETTEL))>0) {
- zulassung.Note = rand()%5+1;
- write(Pipe_AMT, &zulassung, sizeof(ZETTEL));
- }}
- void Pruefungsamt(int Pipe_PRUE)
- {
- // liest Zulassungszettel aus der pipe Pipe_PRUE und gibt sie mittels "printf()" aus
- ZETTEL zulassung;
- while(read(Pipe_PRUE, &zulassung, sizeof(ZETTEL))>0) {
- printf("Name: %s\nVorname: %s\nMatrikel-Nr: %i\nNote: %i\n\n",
- zulassung.Name, zulassung.Vorname, zulassung.Matrikel_Nr, zulassung.Note);
- }}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement