SHARE
TWEET

main

a guest Jan 22nd, 2020 60 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include<sys/ipc.h>
  3. #include<sys/msg.h>
  4. #include <unistd.h>
  5. #include <stdlib.h>
  6. #include <sys/wait.h>
  7. #include <sys/sem.h>
  8. #include <sys/shm.h>
  9. #include <fcntl.h>
  10. #include "operacje.c"
  11. #include "operacje.h"
  12.  
  13. #define P 50   // liczba procesow prod i kons
  14. #define MAX 10  //rozmiar buforu
  15. #define MAX2 12 // + dwa pola na indeksy zapis/odczyt
  16. #define PUSTY 1 //typ komunikatu
  17. #define PELNY 2 //typ komunikatu
  18. #define N 2
  19.  
  20. //struktura komunikatu
  21. struct bufor{
  22.         long mtype;
  23.         int mvalue;
  24. };
  25.  
  26. // funkcja do obsługi sygnału 2  SIGINT
  27.  
  28. int main()
  29. {
  30.    key_t klucz, kluczm, kluczs;  //klucze do kk, pam. dz. i sem
  31.    int msgID; //id kolejki kom.
  32.    int shmID;   //id pamieci dzielonej
  33.    int semID;
  34.  
  35.    int i;
  36.    struct bufor komunikat;
  37. //****************************************************************************************
  38. //tworzenie klucza do kolejki komunikatow i uzyskiwanie dostepu do niej
  39.    if ( (klucz = ftok(".", 'A')) == -1 )
  40.    {
  41.       printf("Blad ftok (a)\n");
  42.       exit(-2);
  43.    }
  44.  
  45.    msgID=msgget(klucz,IPC_CREAT|IPC_EXCL|0666); //tworzenie kk
  46.    if (msgID==-1)
  47.         {printf("blad kolejki komunikatow\n"); exit(1);}
  48. //****************************************************************************************
  49. //tworzenie klucza do pamieci dzielonej i uzyskiwanie dostepu do niej
  50.   if((kluczm=ftok(".",'B'))==-1){
  51.         printf("blad ftok (b)\n");
  52.         exit(-2);
  53. }
  54.    shmID=shmget(kluczm, MAX2*sizeof(int), IPC_CREAT|IPC_EXCL|0666);//tworzenie pam. dz.
  55. //****************************************************************************************
  56. //tworzenie klucza do semaforu, alokacja oraz inicjalizacja
  57.   if((kluczs=ftok(".", 'C'))==-1){
  58.         printf("blad ftok (c)\n");
  59.         exit(-2);                                                                                                                                                                                                                            }
  60.   semID=semget(kluczs, N, IPC_CREAT|IPC_EXCL|0666);//alokacja semaforów
  61.   if(semID==-1){
  62.         printf("blad semget\n");
  63.         exit(1);
  64.   }
  65.   //semctl(semID, 0, SETVAL, 0);????????????????
  66.   semctl(semID, PUSTY, SETVAL, 1);
  67.   semctl(semID, PELNY, SETVAL, 1);
  68.   printf("Semafory gotowe!\n");
  69. //****************************************************************************************
  70. //wysylanie komunikatow, uruchamianie konumentow i producentow
  71.    komunikat.mtype=PUSTY;
  72.    komunikat.mvalue=0;  // wazny jest typ komunikatu, tresc - dowolna
  73.  
  74.  for(i=0;i<MAX;i++)
  75.          {
  76.         if( msgsnd(msgID,&komunikat,sizeof(komunikat.mvalue),0)==-1) //wyslanie komunikatu typu pusty
  77.                 {
  78.                         printf("blad wyslania kom. pustego\n");
  79.                         exit(1);
  80.                 };
  81.            printf("wyslany pusty komunikat %d\n",i);
  82.         }
  83.  
  84.    for (i = 0; i < P; i++)
  85.       switch (fork())
  86.       {
  87.          case -1:
  88.             perror("Blad fork (mainprog)");
  89.             exit(2);
  90.          case 0:
  91.             execl("./prod","prod", NULL);
  92.       }
  93.  
  94.    for(i=0;i<P;i++)
  95.         switch (fork())
  96.         {
  97.         case -1:
  98.  
  99.             printf("Blad fork (mainprog)\n");
  100.             exit(2);
  101.         case 0:
  102.                 execl("./kons","kons",NULL);
  103.         }
  104.  
  105. /*
  106. if (fork()==0)
  107.             execl("./prod","prod", NULL);
  108. else
  109.             execl("./kons","kons",NULL);
  110. */
  111. for(i=0;i<2*P;i++)
  112.    wait(NULL);
  113.  
  114. //zwalnianie zasobow
  115.    msgctl(msgID,IPC_RMID,NULL);
  116.        shmctl(shmID,IPC_RMID, NULL);
  117.    semctl(semID, N, IPC_RMID, NULL);                                                                                                                                                                                                            printf("MAIN: Koniec.\n");
  118. }
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