SHARE
TWEET

Untitled

a guest Jan 18th, 2019 80 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //mainprogram.c
  2. #include <stdio.h>
  3. #include <sys/shm.h>
  4. #include <sys/ipc.h>
  5. #include <sys/msg.h>
  6. #include <stdlib.h>
  7.  
  8. struct message{
  9.     long mtype;
  10.     int mvalue;
  11. };
  12.  
  13. void wypisz_widelce(int *w){
  14.     int i;
  15.     for(i = 0;i<5;i++){
  16.         printf("Widelec[%d] = %d\n",i+1,w[i]);
  17.     }
  18. }
  19.  
  20. int main(int argc, char *argv[]){
  21.     key_t key_message, key_memory;
  22.     int msgID,shmID;
  23.     int i;
  24.     int F = 5;
  25.     char bufor[3];
  26.     int *widelec;
  27.     struct message kom;
  28.  
  29.     //kolejka
  30.     if( (key_message = ftok(".",'A')) == -1){
  31.         printf("Ftok message_key error (main)\n");
  32.         exit(1);
  33.     }
  34.     if( (msgID = msgget(key_message,IPC_CREAT|IPC_EXCL|0666)) == -1){
  35.         printf("Msgget error (main)\n");
  36.         exit(1);
  37.     }
  38.    
  39.     //pamiec
  40.     if( (key_memory = ftok(".",'B')) == -1){
  41.         printf("Ftok memory_key error (main)\n");
  42.         exit(1);
  43.     }
  44.     if( (shmID = shmget(key_memory,5 * sizeof(int),IPC_CREAT|IPC_EXCL|0666)) == -1){
  45.         printf("Shmget error (main)\n");
  46.         exit(1);
  47.     }  
  48.    
  49.     fflush(stdout);
  50.  
  51.     widelec = (int*)shmat(shmID,NULL,0);    //przydzielenie pamieci dzielonej.
  52.  
  53.     for(i = 0;i < F;i++){
  54.         widelec[i] = 0;
  55.     }
  56.     wypisz_widelce(widelec);
  57.  
  58.     for(i = 0;i < F;i++){   //wyslanie komunikatu o pustych widelcach
  59.         kom.mtype = i + 1;
  60.         if(msgsnd(msgID,&kom,sizeof(kom.mvalue),0) == -1){
  61.             printf("Msgsnd widelec error (main)\n");
  62.             exit(1);
  63.         }
  64.     }
  65.    
  66.     printf("wyslano komunikaty\n");
  67.  
  68.     //tworzenie procesu filozofow
  69.     for(i = 0;i < F;i++)
  70.         switch(fork())
  71.         {
  72.             case -1:
  73.                     perror("Fork error (main)");
  74.                     exit(2);
  75.             case 0:
  76.                     sprintf(bufor,"%d",i);      //przekazanie numeru
  77.                     execl("./filozof","filozof",bufor,NULL);
  78.         }
  79.    
  80.     for(i = 0;i < 5;i++){
  81.         wait(NULL);
  82.     }
  83.  
  84.     msgctl(msgID,IPC_RMID,NULL);
  85.    
  86.     shmctl(shmID,IPC_RMID,NULL);
  87.    
  88.     printf("MAIN: Koniec.\n");
  89. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top