Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <sys/wait.h>
- int SemId; /* identifikacijski broj skupa semafora */
- void SemGet(int n)
- { /* dobavi skup semafora sa ukupno n semafora */
- SemId = semget(IPC_PRIVATE, n, 0600);
- if (SemId == -1) {
- printf("Nema semafora!\n");
- exit(1);
- }
- }
- int SemSetVal(int SemNum, int SemVal)
- { /* postavi vrijednost semafora SemNum na SemVal */
- return semctl(SemId, SemNum, SETVAL, SemVal);
- }
- int SemOp(int SemNum, int SemOp)
- { /* obavi operaciju SemOp sa semaforom SemNum */
- struct sembuf SemBuf;
- SemBuf.sem_num = SemNum;
- SemBuf.sem_op = SemOp;
- SemBuf.sem_flg = 0;
- return semop(SemId, &SemBuf, 1);
- }
- void SemRemove(void)
- { /* uništi skup semafora */
- (void) semctl(SemId, 0, IPC_RMID, 0);
- }
- int main()
- {
- int N = 1; // kapacitet vrtuljka
- int V = 1; // broj voznji
- int P = 1; // broj posjetitelja
- SemGet(4);
- SemSetVal(0, 0);
- SemSetVal(1, 0);
- SemSetVal(2, 0);
- SemSetVal(3, 0);
- if (fork() == 0) { // vrtuljak
- while (V--) {
- printf("Priprema za pocetak voznje.\n");
- SemOp(0, N);
- SemOp(1, -N);
- printf("VOZNJA!\n");
- SemOp(2, N);
- SemOp(3, -N);
- }
- } else {
- for (int i=0; i<P; i++) {
- if (fork() == 0) { // posjetitelj
- SemOp(0, -1);
- printf("Posjetitelj %d je sjeo.\n", i);
- SemOp(1, 1);
- SemOp(2, -1);
- printf("Posjetitelj %d je sisao.\n", i);
- SemOp(3, 1);
- exit(0);
- }
- }
- }
- printf("1*\n");
- while (P--) wait(NULL);
- printf("2*\n");
- wait(NULL);
- printf("3*\n");
- SemRemove();
- printf("4*\n");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement