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
- };
- 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]);
- }}}
- void posaljiPoruku(int i, int clock, const char* message){
- sprintf(sendBuf, "%s(%d, %d)", message, processID, clock);
- printf("Filozof P%d salje poruku %s filozofu P%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;
- }else{ posaljiPoruku(i, otherClock, RESPONSE);
- }
- }
- }
- void KO(){
- printf("Filozof %d je za stolom", processID);
- sat++;
- sleep(3);
- }
- void filozof(int i){
- posaljiZAHTJEV();
- primiZAHTJEV();
- primiODGOVOR();
- KO();
- posaljiODGOVOR();
- }
- int konf(int i){
- int randNum=rand()%((20+1)-1)+1;
- printf("Filozof %d sjedi %d ms\n", processID,randNum);
- return randNum;
- }
- void zatvori(){
- for(int i=1; i<N+1;++i){
- if(i==processID){ continue;}
- close(cjevovod[processID][i][citaj]);
- close(cjevovod[i][processID][pisi]);
- }
- }
- 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++;
- }
- //pokreni filozofe
- for(int i=1;i<N+1;++i){
- processID=i;
- int cekaj=konf(i);
- sleep(cekaj);
- filozof(i);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement