Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <unistd.h>
- #include <sys/ipc.h>
- #include <sys/msg.h>
- #include <sys/shm.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <sys/sem.h>
- #include "operacje.c"
- #include "operacje.h"
- struct bufor{
- long mtype;
- int mvalue;
- };
- int *pam;
- #define MAX 10
- #define MAX2 12
- #define PELNY 2
- #define PUSTY 1
- #define odczyt pam[MAX]
- #define zapis pam[MAX+1]
- #define N 2
- int main()
- {
- key_t klucz, kluczm, kluczs;
- int msgID;
- int shmID;
- int semID;
- struct bufor komunikat;
- //printf("producent--------------------------------\n");
- //uzyskanie dostepu do kolejki komunikatow
- if((klucz=ftok(".", 'A'))==-1){
- printf("blad ftok A\n");
- exit(-2);
- }
- msgID=msgget(klucz, IPC_CREAT|0666);
- if(msgID==-1){
- printf("blad kolejki komunikatow(producent)\n");
- exit(1);
- }
- //****************************************************************
- //uzyskanie dostepu do pamieci dzielonej
- if((kluczm=ftok(".", 'B'))==-1){
- printf("blad ftok B\n");
- exit(-2);
- }
- shmID=shmget(kluczm, MAX2*sizeof(int), IPC_CREAT|0666);
- if(shmID==-1){
- printf("blad pamieci dzielonej(producent)\n");
- exit(1);
- }
- //****************************************************************
- //przylaczenie pamieci dzielonej pam=(int*)shmat(shmID, NULL, 0);
- if(pam==NULL){
- printf("blad przylaczania pamieci dzielonej(producent)\n");
- }
- //****************************************************************
- //semafor
- if((kluczs=ftok(".", 'C'))==-1){
- printf("blad ftok C\n");
- exit(-2);
- }
- semID=semget(kluczs, N, IPC_CREAT|0666);
- //****************************************************************
- //wysylanie/odbieranie odpowiednich komunikatow
- if(msgrcv(msgID, &komunikat, sizeof(komunikat.mvalue), PUSTY, 0)==-1){
- printf("blad odbioru PUSTEGO komunikatu\n");
- exit(1);
- }else{
- printf("odebralem komunikat PUSTY\n");
- }
- //wait pusty
- waitSemafor(semID, PUSTY, IPC_CREAT | 0666);
- pam[zapis]=getpid();
- komunikat.mtype=PELNY;
- if(msgsnd(msgID, &komunikat, sizeof(komunikat.mvalue), 0)==-1){
- printf("blad wysylania komunikatu PELNEGO\n");
- exit(1);
- }else{
- printf("wyslalem PELNY\n");
- }
- //produkcja - dodanie rekordu do puli buforow --pid'u procesu pod indeks - zapis
- printf("Producent pid - %i, index - %d, zapisano - %d\n", getpid(), zapis, pam[zapis]);
- //modyfikacja indeksu do zapisu
- zapis=(zapis+1)%MAX;
- //signal pusty
- signalSemafor(semID, PUSTY);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement