Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include<stdlib.h>
- #include <sys/stat.h>
- #include <sys/types.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <sys/wait.h>
- #include <time.h>
- #define MAX(a,b) ((a) > (b) ? (a) :(b))
- #define RESPONSE "Odgovor"
- #define REQUEST "Zahtjev"
- #define MAXREAD 20 /* najveca duljina poruke*/
- #define BUFFERSIZE 30
- #define N 5
- int processID;
- int sat=1;
- int cjevovod[N][N][2];
- int responseQ[N];
- char recBuf[BUFFERSIZE];
- char sendBuf[BUFFERSIZE];
- enum operacija {
- citaj=0,
- pisi=1
- };
- //stvara se cjevovod ide od 1 da ne bi imala filozofa nula ugl
- void stvoriCjevovod(){
- for(int x=1; x<N+1; x++){
- for(int y=1; y<N+1; y++){
- if(x==y) continue;
- pipe(cjevovod[x][y]); // ovo je ka npr cjevovod koji spaja procese 1-2(1 je ulaz a 2 izlaz), isto se stvara i 2-1(2 ulaz, a 1 izlaz)
- }}}
- void posaljiPoruku(int i, int clock, const char* message){
- sprintf(sendBuf, "%s(%d, %d)", message, processID, clock);
- printf("Filozof F%d salje poruku %s filozofu F%d\n", processID, sendBuf, i);
- write(cjevovod[processID][i][pisi], sendBuf, strlen(sendBuf)+1);
- }
- void primiPoruku(int i, int* drugiID, int* otherClock){
- read(cjevovod[i][processID][citaj],recBuf, MAXREAD);
- sscanf(recBuf, "%*7s(%d,%d)", drugiID, otherClock);
- printf("Filozof P%d prima poruku %s\n", processID, recBuf);
- sat=MAX(sat, *otherClock)+1;
- }
- void posaljiZAHTJEV(){
- for(int i=1; i<N+1; ++i){
- if(i==processID){ continue;}
- posaljiPoruku(i, sat, REQUEST);
- }
- }
- void primiODGOVOR(){
- int drugiID, otherClock;
- for(int i=1; i<N+1; i++){
- if(i==processID) continue;
- primiPoruku(i, &drugiID, &otherClock);
- }
- }
- void posaljiODGOVOR(){
- for(int i=1; i<N+1;i++){
- if(i==processID) continue;
- if(responseQ[i]){
- posaljiPoruku(i, responseQ[i], RESPONSE);
- responseQ[i]=0;
- }
- }
- }
- void primiZAHTJEV(){
- int drugiPID, otherClock;
- int trenutniSat=sat;
- for(int i=1; i<N+1;i++){
- if(i==processID) continue;
- primiPoruku(i, &drugiPID, &otherClock);
- if((trenutniSat<otherClock) || (trenutniSat==otherClock && otherClock && processID <i)){
- responseQ[i]=otherClock; //ovo gledam koji je sat vec
- }else{ posaljiPoruku(i, otherClock, RESPONSE);
- }
- }
- }
- void KO(){
- printf("Filozof %d je za stolom\n", processID);
- sat++;
- sleep(3);
- }
- void konferencija(){
- int randNum=(rand()%((2000+1)-100)+100)*1000;
- usleep(randNum);
- printf("Filozof %d sjedi na konferenciji%d ms\n", processID,randNum);
- }
- void filozof(){
- konferencija();
- posaljiZAHTJEV(); //zeli za stol, salje svima
- primiZAHTJEV();
- primiODGOVOR();
- KO();
- posaljiODGOVOR();
- }
- void zatvori(){
- for(int i=1; i<N+1;++i){
- if(i==processID){ continue;}
- close(cjevovod[processID][i][citaj]); //zatvaram kraj za citanje
- close(cjevovod[i][processID][pisi]); //zatvaram kraj za pisanje
- }
- for(int i=0;i<N;++i){
- filozof();
- }
- }
- int main(void)
- { int sjedi[5];
- srand((unsigned)time(NULL));
- stvoriCjevovod();
- for(int i=1; i<N+1; i++){
- int pId=fork();
- if(pId== -1){
- printf("Dijete nije kreirano");
- exit(1);
- }else if(pId==0){
- processID=i;
- zatvori();
- exit(0);
- }
- }
- for(int i=0; i<N;){
- if(wait(NULL)>0)
- i++;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement