-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathproducent.c
170 lines (131 loc) · 3.44 KB
/
producent.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/shm.h>
#include<signal.h>
#include<unistd.h>
#include<time.h>
#include "biblioteka.h"
#define plikWyjscia "wyjscie.txt"
#define plikWejscia "wejscie.txt"
#define plikWejscia2 "wejscie2.txt"//ustal 2 plik wejscia w razie wielokrotnego zapisu/odczytu
#define kasujDanePoOdczytaniu 1
#define sposobDrukowania 1//0 - drukuj bufor, 1 - drukuj dane
//warto zmienic czas lagu przy zmienianianiu rodzaju druku
#define szansaNaLagOdczytu 100// Szansa wyrazona w procentach
#define szansaNaLagZapisu 100// Szansa wyrazona w procentach
#define czasLaguOdczytu 2
#define czasLaguZapisu 1
char c;
pid_t pid=-1;
int trybW=0;
void porzadki();
int main(int argc,char** argv){
atexit(porzadki);
signal(SIGINT,exit);
stworzZbiorSemaforow();
stworzPamiecWspoldzielona();
odwzoruj();
if(argc>1){
if(argv[1][0]=='r'){
pid=0;
trybW=1;
}
else if(argv[1][0]=='w'){
pid=1;
trybW=1;
}
else{
perror("bledny argument programu\n");
exit(0);
}
}
else{//jesli bezargumentowe wywolanie programu to:
inicjujPamiec();
inicjujSemafory();
pid=fork();
}
if(pid<0)perror("blad tworzenia procesu");
if(pid==0){///////////////////////////////////////////////////////////////////////////
//ODCZYT Z BUFORA
int czas=time(NULL);
srand(czas);
FILE *plik;
if(trybW==0){plik = fopen(plikWyjscia,"w");
if(plik==NULL){
perror("Nie udalo sie otworzyc pliku");
return 1;
}}
while(1){
if(rand()%100<szansaNaLagOdczytu)usleep(1000000*czasLaguOdczytu);
/////////////////////Strefa Krytyczna
obniz(3);//obniz semafor ochrony przed jednoczesnym odczytem
obniz(1);//obniz semafor ilosci danych w buforze
c=odczytaj(kasujDanePoOdczytaniu);
#if sposobDrukowania==0
drukujBufory();
#endif
podnies(3);//podnies semafor ochrony przed jednoczesnym odczytem
podnies(0);//podnies semafor ilosci miejsca
////////////////////////////////////koniec strefy krytycznej
#if sposobDrukowania==1
putc(c,stdout);fflush(stdout);//proste drukowanie odczytanych liter
#endif
if(trybW==0) putc(c,plik);//zapis do pliku
}
fclose(plik);
porzadki();
}
if(pid>0){//////////////////////////////////////////////////////////////////////////////
//ZAPIS DO BUFORA
#if sposobDrukowania==0
if(trybW==0)zerujBufor();
#endif
int czas=time(NULL);
srand(czas);
FILE *plik;
if(trybW==0)plik = fopen(plikWejscia,"r");
else plik = fopen(plikWejscia2,"r");
if(plik==NULL){
perror("Nie udalo sie otworzyc pliku");
return 1;
}
while(1){
if(rand()%100<szansaNaLagZapisu)usleep(1000000*czasLaguZapisu);
c=getc(plik);
/////////////////////////////////////Strefa Krytyczna
obniz(2);//obniz semafor ochrony przed jednoczesynm zapisem
obniz(0);//Obniz samafor ilosci miejsca
if(feof(plik)){//jesli koniec pliku
podnies(1);
podnies(2);
break;
}
zapisz(c);//zapisz c do bufora
#if sposobDrukowania==0
drukujBufory();
#endif
podnies(2);//podnies semafor ochrony przed jednoczesym zapisem
podnies(1);//podnies semafor ilosci danych w buforze
//////////////////////////////////////koniec strefy krytycznej
}
fclose(plik);
}
return 0;
}
void porzadki(){
if(trybW==1){//TRYB JEDNOSTRONNEGO ODCZYTU
odnowSemaforyWielow();//upewnij sie ze samafory ochrony przed podwojynm zapisem sa w gorze
exit(0);
}
else if(pid==0){//ODCZYT Z BUFORA
usunPamiec();
usunSemafory();
}
else if(pid>0){}//ZAPIS DO BUFORA
else {//BLAD TWORZENIEA PROCESOW
usunPamiec();
usunSemafory();
}
printf("KONIEC PROCESU\n");
}