#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/stat.h>
int main(int argc, char * argv[])
{
int flaga=0;
if(argc!=3)
{
perror("argc");
exit(1);
}
int timeA=time(NULL);
int pi,ki;
ki=atoi(argv[1]);
if(errno==ERANGE)
{
perror("");
exit(1);
}
pi=atoi(argv[2]);
if(errno==ERANGE)
{
perror("");
exit(1);
}
if((ki>100)||(ki<0)||(pi>100)||(pi<0))
{
printf("podano za duza ilosc p lub k\n");
exit(1);
}
FILE * output;
char plik[50];
printf("ik = %d ip = %d\n\n",ki,pi);
int i;
int pip[2];
pipe2(pip,O_NONBLOCK);
for(i=0;i<pi;i++)
{
switch(fork())
{
case -1:
break;
case 0:
flaga=4;
goto B;
} }
A:
if(flaga==3)
{
close(pip[1]);
sprintf(plik,"konsumenci/konsument%d",getpid());
printf("zapis do %s\n",plik);
char znak;
int pl;
while(1)
{
while((pl=read(pip[0],&znak,sizeof(char)))<=0)
{
if((errno!=EAGAIN)||(pl==0))
{
perror("");
goto wyjscie;
}
}
if(flaga==3)
output=fopen(plik,"w");
flaga=1;
fprintf(output,"%c",znak);
printf("konsument wczytal i zapisal %c \n",znak);
};
wyjscie:
fclose(output);
printf("konsument zakonczyl dzialanie\n");
exit(0);
}
for(i=0;i<ki;i++)
{
switch(fork())
{
case -1:
break;
case 0:
flaga=3;
goto A;
}
}
B:
if(flaga==4)
{
srand(timeA+i);
close(pip[0]);
sprintf(plik,"producenci/producent%d",getpid());
output=fopen(plik,"w");
printf("zapis do pliku %s\n",plik);
char znak;
int ilosc=rand()%200;
printf("zapis %d danych \n",ilosc);
for(i=0;i<ilosc;i++)
{
znak=rand()%127;
while(write(pip[1],&znak,sizeof(char))<=0)
{
if(errno!=EAGAIN)
exit(0);
};
fprintf(output,"%c",znak);
printf("zapisano %c\n",znak);
}
close(pip[1]);
exit(0);
}
close(pip[0]);
close(pip[1]);
int r,x;
for(i=0;i<pi+ki;i++)
{
r=wait(&x);
printf("potomek %d zakonczony z kodem %d\n\n",r,x);
}
exit(0); }