Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <unistd.h>
- #include <semaphore.h>
- #include <errno.h>
- #include <sys/types.h>
- #include <sys/mman.h>
- #include <sys/stat.h>
- #include <sys/fcntl.h>
- #include <stdio.h>
- #include <signal.h>
- #include <stdlib.h>
- #define shm_size 4000
- /* gcc -std=c99 machine_auto.c -lpthread -lrt -Wall -o machine_main */
- int count=0,working=0;
- int main()
- {
- char* shmptr;
- int shm_mach,index,i,j,k,licznik=0;
- char shm_m[] = "shared";
- char sem_m[] = "semaphore";
- sem_t *sem_mach;
- shm_mach=shm_open(shm_m, O_RDWR ,0);
- if(shm_mach == -1)
- {
- perror("SHM_OPEN FAILED/TURN ON INTERFACE FIRST");
- exit(-1);
- }
- shmptr=mmap(0,shm_size,PROT_WRITE|PROT_READ,MAP_SHARED,shm_mach,0);
- if(shmptr == MAP_FAILED)
- {
- perror("MMAP FAILED");
- exit(-1);
- }
- sem_mach = sem_open(sem_m,0);
- if(sem_mach==SEM_FAILED)
- {
- perror("SEM_OPEN FAILED");
- exit(-1);
- }
- char *shm_ptr=(char *)shmptr;
- int value;
- sem_getvalue(sem_mach,&value);
- for(index = 0; index < 10000; index++)
- {
- //STANOWISKO 1
- //sem_wait(sem_mach);
- if(shm_ptr[7]!=-1 && shm_ptr[7]!=-2 && shm_ptr[2]==1 && shm_ptr[1]!=1 && shm_ptr[1]!=2 && shm_ptr[50]==0)
- {
- //sem_post(sem_mach);
- for(i=0;i<15;i++)
- {
- sleep(1);
- printf("\n SERWIS ====> WORK-STATION 1 \t");
- licznik++;
- shm_ptr[1]=-1;
- count=-1;
- if(shm_ptr[2]==0)
- {
- printf("\n ZABRANO PUDEŁECZKO, WRACAM, NIE MA CO... \t");
- for(k=0;k<licznik;k++)
- {
- sleep(1);
- printf("\n ====> SERWIS \t");
- //sem_wait(sem_mach);
- shm_ptr[1]=-1;
- //sem_post(sem_mach);
- }
- k=0;
- sleep(1);
- printf("\n MASZYNA WRÓCIŁA \t");
- licznik=0;
- //sem_wait(sem_mach);
- shm_ptr[1]=0;
- //sem_post(sem_mach);
- count=0;
- }
- if(count==0)
- goto przeskok;
- //sem_wait(sem_mach);
- //sem_post(sem_mach);
- }
- i=0;
- for(j=0;j<5;j++)
- {
- //sem_wait(sem_mach);
- shm_ptr[1]=-2;
- shm_ptr[5]=1;
- //sem_post(sem_mach);
- sleep(1);
- printf("\n WORK-STATION 1 - FILLING");
- }
- j=0;
- //sem_wait(sem_mach);
- shm_ptr[50]=1;
- shm_ptr[5]=0;
- //sem_post(sem_mach);
- sleep(1);
- printf("\n NAPEŁNIONE! \t");
- for(k=0;k<3;k++)
- {
- sleep(1);
- printf("\n WORK-STATION 1 ====> SERWIS \t");
- //sem_wait(sem_mach);
- shm_ptr[1]=-1;
- //sem_post(sem_mach);
- }
- k=0;
- sleep(1);
- printf("\n MASZYNA WRÓCIŁA PO NAPEŁNIENIU \t");
- //sem_wait(sem_mach);
- shm_ptr[1]=0;
- //sem_post(sem_mach);
- count=0;
- }
- else if(shm_ptr[7]!=1 && shm_ptr[7]!=2 && shm_ptr[3]==1 && shm_ptr[1]!=-1 && shm_ptr[1]!=-2 && shm_ptr[51]==0)
- {
- //sem_post(sem_mach);
- for(i=0;i<15;i++)
- {
- sleep(1);
- printf("\n SERWIS ====> WORK-STATION 2 \t");
- licznik++;
- count=1;
- shm_ptr[1]=1;
- if(shm_ptr[3]==0)
- {
- printf("\n ZABRANO PUDEŁECZKO, WRACAM, NIE MA CO... \t");
- for(k=0;k<licznik;k++)
- {
- sleep(1);
- printf("\n ====> SERWIS \t");
- //sem_wait(sem_mach);
- shm_ptr[1]=-1;
- //sem_post(sem_mach);
- }
- k=0;
- sleep(1);
- printf("\n MASZYNA WRÓCIŁA \t");
- licznik=0;
- //sem_wait(sem_mach);
- shm_ptr[1]=0;
- //sem_post(sem_mach);
- count=0;
- }
- if(count==0)
- goto przeskok;
- //sem_wait(sem_mach);
- //sem_post(sem_mach);
- }
- i=0;
- for(j=0;j<5;j++)
- {
- sleep(1);
- printf("\n WORK-STATION 2 - FILLING");
- //sem_wait(sem_mach);
- shm_ptr[1]=2;
- shm_ptr[5]=1;
- //sem_post(sem_mach);
- count=2;
- }
- //sem_wait(sem_mach);
- shm_ptr[5]=0;
- //sem_post(sem_mach);
- j=0;
- sleep(1);
- printf("\n NAPEŁNIONE! \t");
- //sem_wait(sem_mach);
- shm_ptr[51]=1;
- //sem_post(sem_mach);
- for(k=0;k<3;k++)
- {
- sleep(1);
- printf("\n WORK-STATION 2 ====> SERWIS \t");
- //sem_wait(sem_mach);
- shm_ptr[1]=1;
- //sem_post(sem_mach);
- count=1;
- }
- k=0;
- sleep(1);
- printf("\n MASZYNA WRÓCIŁA PO NAPEŁNIENIU \t");
- //sem_wait(sem_mach);
- shm_ptr[1]=0;
- //sem_post(sem_mach);
- count=0;
- }
- else if(count==0)
- {
- przeskok:
- //sem_post(sem_mach);
- sleep(1);
- printf("\n MACHINE AT POSITION FREE \t [%d]",index);
- //sem_wait(sem_mach);
- shm_ptr[1]=0;
- //sem_post(sem_mach);
- }
- else
- {
- printf("\n INTERFACE CLOSED \n");
- sem_post(sem_mach);
- sem_unlink(sem_m);
- munmap(shmptr,shm_size);
- close(shm_mach);
- sem_close(sem_mach);
- shm_unlink(shm_m);
- exit(0);
- }
- }
- munmap(shmptr,shm_size);
- close(shm_mach);
- sem_close(sem_mach);
- sem_unlink(sem_m);
- shm_unlink(shm_m);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement