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/shm.h>
- #include <sys/sem.h>
- #include <sys/msg.h>
- #include <stdlib.h>
- #include <values.h>
- #include <semaphore.h>
- static int br_Mjesta = 3;
- static int br_Putnika;
- //sem_t vrtuljak, sjeo, kraj, izasao; //s auditornih vjezbi prof. goluba dostupnih na FER2 materijalima, valjda nece plagijat
- //vrtuljak 0, sjeo 1, kraj 2, izasao 3
- //void clean(){
- //
- // sem_destroy(&vrtuljak);
- // sem_destroy(&sjeo);
- // sem_destroy(&kraj);
- // sem_destroy(&izasao);
- //
- //}
- 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);
- }
- //
- //void init() {
- //
- // if(sem_init(&vrtuljak,1,0) != 0) {
- // printf("Inicijaliziranje semfaora vrtuljak (1) nije uspjelo\n");
- // exit(1);
- // }if(sem_init(&sjeo,1,0) != 0) {
- // printf("Inicijaliziranje semfaora sjeo (2) nije uspjelo\n");
- // exit(1);
- // }if(sem_init(&kraj,1,0) != 0) {
- // printf("Inicijaliziranje semfaora kraj (3) nije uspjelo\n");
- // exit(1);
- // }
- // if(sem_init(&izasao,1,0) != 0) {
- // printf("Inicijalizaija semafora izasao (4) nije uspjela\n");
- // exit(1);
- // }
- //}
- //vrtuljak 0, sjeo 1, kraj 2, izasao 3
- void posjetitelj() {
- SemOp(0, -1);
- printf("sjedi\n");
- SemOp(1, +1);
- SemOp(2, -1);
- printf("ustani\n"); // ili sidji
- SemOp(3, +1);
- }
- void vrti() {
- int i;
- while(1) {
- for (i = 1; i <= br_Mjesta; ++i){
- SemOp(0, +1);
- printf("Posjetitelj %d usao!\n", i);
- }
- for (i = 1; i <= br_Mjesta; ++i){
- SemOp(1, -1);
- printf("Posjetitelj %d je sjeo!\n", i);
- }
- printf("pokreni vrtuljak \n");
- printf("zaustavi vrtuljak \n");
- for (i = 1; i <= br_Mjesta; ++i)
- SemOp(2, +1);
- for (i = 1; i <= br_Mjesta; ++i)
- SemOp(3, -1);
- }
- }
- int main ( int argc, char *argv[] ){
- int i;
- int br_Putnika = atoi(argv[1]);
- // init();
- SemGet(4);
- vrti();
- for (int i = 0; i < br_Putnika; ++i){
- switch (fork()) {
- case -1: printf("Greska!\n");
- exit(1);
- case 0: posjetitelj();
- exit(0);
- }
- }
- while (i--)
- wait(NULL);
- // clean();
- //for(i=0; i<N; i++) {
- // SemOp(3, +1); //semafor br. 3 povecam za 1
- //}
- SemRemove();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement