Advertisement
Guest User

Untitled

a guest
Jun 25th, 2017
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.06 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. typedef struct
  4. {
  5. char Name[20];
  6. char Vorname[20];
  7. long Matrikel_Nr;
  8. int Note;
  9. } ZETTEL, *ZULASSUNG;
  10. /************************************************************/
  11. /* */
  12. /* Erzeugen dreier paralleler Prozesse, die über pipes */
  13. /* kommunizieren: */
  14. /* */
  15. /* SEKRETARIAT ---------> PRÜFER --------->PRÜFUNGSAMT */
  16. /* PIPE_1 PIPE_2 */
  17. /* */
  18. /************************************************************/
  19. void Sekretariat(int), Pruefer(int,int), Pruefungsamt(int);
  20. int counter = 0;
  21. main()
  22. {
  23. int Pipe_1[2], Pipe_2[2]; /* pipe-Deskriptoren */
  24. int Status_1, Status_2, stat;
  25. int pid1, pid2, pid3;
  26. Status_1 = pipe(Pipe_1); /* Erzeugen der pipes */
  27. Status_2 = pipe(Pipe_2);
  28. if ((Status_1 == -1) || (Status_2 == -1)) /* pipe() liefert */
  29. printf("\n!!! kann pipe nicht erzeugen\n"); /* im Fehlerfall-1*/
  30. else
  31. if ((pid1=fork()) == 0) /* nicht Vater */
  32. {
  33. if ((pid2=fork()) == 0) /* Enkel */
  34. {
  35. close (Pipe_1[0]); /* darf in Pipe_1 nicht lesen */
  36. close (Pipe_2[0]); /* darf in Pipe_2 nicht lesen */
  37. close (Pipe_2[1]); /* darf in Pipe_2 nicht schreiben */
  38. Sekretariat(Pipe_1[1]);
  39. }
  40. else /* erstes Kind */
  41. {
  42. waitpid(pid3, &stat, 0);
  43. close(Pipe_1[1]); /* darf in Pipe_1 nicht schreiben */
  44. close(Pipe_2[0]); /* darf in Pipe_2 nicht lesen */
  45. Pruefer(Pipe_1[0], Pipe_2[1]);
  46. }
  47. }
  48. else
  49. {
  50. //waitpid(pid1, &stat, 0);
  51. if ((pid3=fork()) == 0) /* zweites Kind */
  52. {
  53. waitpid(pid2, &stat, 0);
  54. close(Pipe_1[0]); /* darf in Pipe_1 nicht lesen */
  55. close(Pipe_1[1]); /* darf in Pipe_1 nicht schreiben */
  56. close(Pipe_2[1]); /* darf in Pipe_2 nicht schreiben */
  57. Pruefungsamt(Pipe_2[0]);
  58. }
  59. close(Pipe_1[0]);
  60. close(Pipe_1[1]);
  61. close(Pipe_2[0]);
  62. close(Pipe_2[1]);
  63. waitpid(pid1, &stat, 0);
  64. /* der Vaterprozess stirbt nach Erzeugen der Kind- */
  65. /* prozesse, dabei wird implizit für jeden */
  66. /* seiner pipe-Deskriptoren 'close' aufgerufen. */
  67. Lösung zu Übung 2 von Manuel Grüner, Tino Mohr Stefan Friedl, Christian Zorneck
  68. }
  69. }
  70. void Sekretariat(int Pipe_PRUE)
  71. {
  72. /* liest mittels "scanf()" die Zulassungszettel */
  73. /* (Name, Vorname, Matrikelnummer) ein und schreibt */
  74. /* sie in die Pipe mit Deskriptor Pipe_PRUE. */
  75. ZETTEL zulassung;
  76. int stat;
  77. do { //datensaetze einlesen
  78. stat = scanf("%s", zulassung.Name);
  79. stat = scanf("%s", zulassung.Vorname);
  80. stat = scanf("%d", &zulassung.Matrikel_Nr);
  81. if(stat!=EOF)
  82. write(Pipe_PRUE, &zulassung, sizeof(ZETTEL));
  83. }while(stat !=EOF);
  84. }
  85. void Pruefer(int Pipe_SEKR, int Pipe_AMT)
  86. {
  87. /* liest Zulassungszettel aus der pipe Pipe_PRUE,*/
  88. /* trägt eine Note ein und schreibt die Zettel */
  89. /* in die pipe Pipe_AMT. */
  90. ZETTEL zulassung;
  91. while(read(Pipe_SEKR, &zulassung, sizeof(ZETTEL))>0) {
  92. zulassung.Note = rand()%5+1;
  93. write(Pipe_AMT, &zulassung, sizeof(ZETTEL));
  94. }}
  95. void Pruefungsamt(int Pipe_PRUE)
  96. {
  97. // liest Zulassungszettel aus der pipe Pipe_PRUE und gibt sie mittels "printf()" aus
  98. ZETTEL zulassung;
  99. while(read(Pipe_PRUE, &zulassung, sizeof(ZETTEL))>0) {
  100. printf("Name: %s\nVorname: %s\nMatrikel-Nr: %i\nNote: %i\n\n",
  101. zulassung.Name, zulassung.Vorname, zulassung.Matrikel_Nr, zulassung.Note);
  102. }}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement