Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <unistd.h>
- #include <pthread.h>
- #include <stdlib.h>
- #include <signal.h>
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/msg.h>
- struct msgbuf{
- long mtype;
- char mtext[128];
- };
- int brojPosjetitelja = 8;
- int size = 4;
- int brojac = 0;
- int ukupnoPosjetitelja = 0;
- int vrtuljakQueue=0;
- int naVrtuljku=0;
- int spavaj;
- key_t key;
- int vrtuljakqid = -1;
- int qids[8] = {0};
- int msgflg = IPC_CREAT | 0666;
- /*enum poruka{
- zelim=0,
- ustani=1,
- ustani=2
- };
- */
- void die(char *s)
- {
- printf("Greška");
- perror(s);
- exit(1);
- }
- void *posjetitelj(void *vargp) {
- brojac++;
- struct msgbuf posjetiteljwrite;
- key_t pkey = key+brojac;
- int posjetiteljqid = msgget(pkey, msgflg);
- if(posjetiteljqid<0){
- die("posjetiteljqid");
- }
- int ponavljaj=0;
- while(ponavljaj<3){
- spavaj = rand() % (2 + 1 - 1) + 1;
- sleep(spavaj);
- if(vrtuljakQueue<8){ //zahtjev za voznju
- qids[vrtuljakQueue]=posjetiteljqid;
- vrtuljakQueue++;
- posjetiteljwrite.mtype = 1;
- strcpy(posjetiteljwrite.mtext, "Zelim se voziti");
- size_t len = strlen(posjetiteljwrite.mtext)+1;
- int rc=msgsnd(vrtuljakqid, &posjetiteljwrite, len, 0){
- if(rc==-1){
- die("msgsnd");
- }
- int rc=-1;
- while(rc==-1) {
- if(msgrcv(posjetiteljqid, &posjetiteljwrite, 128, 1, 0)!=-1){
- int sjeo = strcmp(posjetiteljwrite.mtext, "Sjedi");
- if(sjeo==0){
- printf("Sjeo POSJETITELJ %d \n", posjetiteljqid);
- naVrtuljku++;
- rc=-1;
- }
- int ustao = strcmp(pwrite.mtext, "Ustani");
- if(ustao==0){
- naVrtuljku--;
- vrtuljakQueue--;
- printf("Sisao POSJETITELJ %d \n", posjetiteljqid);
- break;
- }
- }
- else{
- die("msgrcv");
- }
- }
- ponavljaj++;
- }
- }
- brojac--;
- msgctl(posjetiteljqid, IPC_RMID, NULL);
- printf("POSJETITELJ %d zavrsio s voznjom\n", posjetiteljqid);
- return NULL;
- }
- void *vrtuljak(void *vargp) {
- struct msgbuf vrtuljaread;
- key_t vkey = key;
- vrtuljakqid = msgget(vkey, msgflg);
- if(vrtuljakqid<0){
- die("vrtuljakqid");
- }
- while(1) {
- while(ukupnoPosjetitelja < size){
- if(msgrcv(vrtuljakqid, &vrtuljakread, 128, 1, 0)<0){
- die(msgrcv);
- }else{
- int rckey=qids[ukupnoPosjetitelja];
- ukupnoPosjetitelja++;
- if(ukupnoPosjetitelja <= size){
- vrtuljakread.mtype = 1;
- strcpy(vrtuljakread.mtext, "Sjedi");
- size_t len = strlen(vrtuljakread.mtext)+1;
- msgsnd(rckey, &vrtuljakread, len, 0);
- }
- }
- if(ukupnoPosjetitelja == size & naVrtuljku==size){
- printf("Vrtuljak pokrenut.\n");
- int spavaj = rand() % (3 + 1 - 1) + 1;
- sleep(spavaj);
- printf("Vrtuljak zaustavljen.\n");
- for(int j=0; j<size; j++){
- vrtuljakread.mtype = 1;
- strcpy(vrtuljakread.mtext, "Ustani");
- size_t len = strlen(vrtuljakread.mtext)+1;
- int rc=msgsnd(qids[j], &vrtuljakread, len, 0)
- if(rc==-1){
- die("msgsnd");
- }else
- qids[j]=qids[j+size]; //pomicanje reda
- }
- }
- while(naVrtuljku!=0){}
- ukupnoPosjetitelja = 0;
- if(brojac<size){
- msgctl(vrtuljakqid, IPC_RMID, NULL);
- printf("Vrtuljak zavrsio \n");
- break;
- }
- }
- }
- return NULL;
- }
- int main(){
- srand((unsigned)time(NULL));
- pthread_t threads[brojPosjetitelja+1];
- key=getuid();
- int i=0;
- //pokrenuti vrtuljak;
- pthread_create(&threads[i], NULL, vrtuljak, NULL);
- while(vrtuljakqid==-1){}
- for (i = 1; i <=brojPosjetitelja; i++) {
- //pokrenuti posjetitelje;
- pthread_create(&threads[i], NULL, posjetitelj, NULL);
- }
- for (i = 1; i <=brojPosjetitelja; i++) {
- pthread_join(threads[i], NULL);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement