Advertisement
Guest User

Untitled

a guest
Dec 10th, 2018
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.91 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/ipc.h>
  4. #include <sys/sem.h>
  5. #include <unistd.h>
  6. #include <stdlib.h>
  7. #include <sys/wait.h>
  8.  
  9. int SemId;   /* identifikacijski broj skupa semafora */
  10.  
  11. void SemGet(int n)
  12. {  /* dobavi skup semafora sa ukupno n semafora */
  13.     SemId = semget(IPC_PRIVATE, n, 0600);
  14.     if (SemId == -1) {
  15.       printf("Nema semafora!\n");
  16.       exit(1);
  17.    }
  18. }
  19. int SemSetVal(int SemNum, int SemVal)
  20. {  /* postavi vrijednost semafora SemNum na SemVal */
  21.     return semctl(SemId, SemNum, SETVAL, SemVal);
  22. }
  23. int SemOp(int SemNum, int SemOp)
  24. {  /* obavi operaciju SemOp sa semaforom SemNum */
  25.     struct sembuf SemBuf;
  26.     SemBuf.sem_num = SemNum;
  27.     SemBuf.sem_op  = SemOp;
  28.     SemBuf.sem_flg = 0;
  29.     return semop(SemId, &SemBuf, 1);
  30. }
  31. void SemRemove(void)
  32. {  /* uništi skup semafora */
  33.     (void) semctl(SemId, 0, IPC_RMID, 0);
  34. }
  35.  
  36. int main()
  37. {
  38.     int N = 1; // kapacitet vrtuljka
  39.     int V = 1; // broj voznji
  40.     int P = 1; // broj posjetitelja
  41.  
  42.     SemGet(4);
  43.     SemSetVal(0, 0);
  44.     SemSetVal(1, 0);
  45.     SemSetVal(2, 0);
  46.     SemSetVal(3, 0);
  47.  
  48.     if (fork() == 0) {      // vrtuljak
  49.         while (V--) {
  50.             printf("Priprema za pocetak voznje.\n");
  51.             SemOp(0, N);
  52.             SemOp(1, -N);
  53.             printf("VOZNJA!\n");
  54.             SemOp(2, N);
  55.             SemOp(3, -N);
  56.         }
  57.     } else {
  58.         for (int i=0; i<P; i++) {
  59.             if (fork() == 0) {      // posjetitelj
  60.                 SemOp(0, -1);
  61.                 printf("Posjetitelj %d je sjeo.\n", i);
  62.                 SemOp(1, 1);
  63.                 SemOp(2, -1);
  64.                 printf("Posjetitelj %d je sisao.\n", i);
  65.                 SemOp(3, 1);
  66.                 exit(0);
  67.             }
  68.         }
  69.     }
  70.     printf("1*\n");
  71.     while (P--) wait(NULL);
  72.     printf("2*\n");
  73.     wait(NULL);
  74.     printf("3*\n");
  75.     SemRemove();
  76.     printf("4*\n");
  77.     return 0;
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement