#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdbool.h>
#include <sched.h>
#include <sys/mman.h>
#define B_SIZE 60
typedef struct {
int z;
int chce1;
int chce2;
int kto_czeka;
} bufor_t;
int main (int argc, char argv[] )
{
bufor_t buf;
struct sched_param par;
pid_t pid;
int stat;
int fd, size;
int chce1=0;
int chce2=0;
int kto_czeka=1;
int potomny1, potomny2, macierzysty;
int k=0;
int z,q=0;
unsigned char buf_naglowek[54];
unsigned char bufor;
int fd1,fd2, i=0, w_pliku=0, wysokosc=0, szerokosc=0, l_pix=0, bufsize;
ssize_t nread, nwrite;
off_t newpos;
charprioryt1 =argv[1];
charprioryt2 =argv[2];
charprioryt3 =argv[3];
charprioryt4 =argv[4];
charprioryt5 =argv[5];
int priorytet1=(int)prioryt1;
int priorytet2=(int)prioryt2;
int priorytet3=(int)prioryt3;
int priorytet4=(int)prioryt4;
int priorytet5=(int)prioryt5;
int pp1 = rand()%priorytet3 + priorytet2 + 1;
int pp2 = rand()%priorytet5 + priorytet4 + 1;
// Tworzenie pamieci wspolnej
if((fd=shm_open("bufo",O_RDWR | O_CREAT, 07774)) == -1)
{ perror("open");
exit(-1); }
size = ftruncate (fd, sizeof(bufor_t));
if (size < 0)
{ perror("trunc");
exit(-1); }
buf = (bufor_t*) mmap(0, sizeof(bufor_t), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (buf == NULL)
{ perror("map");
exit(-1); }
// Sprawdzanie parametrow
if (argc < 6)
{
printf(" Nie podales za mao parametru \n");
exit (1);
}
if (argc > 6)
{
printf(" Podales zbyt duzo paramterow \n");
exit (1);
}
// Sprawdzanie i otwieranie pliku monalisa
if (access("monalisa.bmp", F_OK) == -1)
{
perror("monalis.bmp nie istnieje \n");
exit(1);
}
system("cp /tmp/Cei/pr2/monalisa.bmp /tmp/Cei/pr2/monalisa-kopia.bmp");
if ((fd1 = open ("monalisa-kopia.bmp", O_RDWR)) == -1)
{
perror (" Nie idzie otworzyc pliku monalisa-kopia.bmp\n");
exit(1);
}
//Sprawdzanie obrazka
newpos = lseek (fd1, (off_t)2, SEEK_SET); // od 2 bajtu wielkosc pliku - 4 bajtowa dana
nread = read (fd1, buf_naglowek, 4);
for (i=3;i>=0;i--)
w_pliku=w_pliku<<8 | (int) buf_naglowek[i];
newpos = lseek (fd1, (off_t)18, SEEK_SET); // od 18 bajtu szerokosc obrazka - 4 bajtowa dana
nread = read (fd1, buf_naglowek, 4);
for (i=3;i>=0;i--)
szerokosc=szerokosc<<8 | (int) buf_naglowek[i];
nread = read (fd1, buf_naglowek, 4); // od 22 bajtu wysokosc obrazka - 4 bajtowa dana
for (i=3;i>=0;i--)
wysokosc=wysokosc<<8 | (int) buf_naglowek[i];
newpos = lseek (fd1, (off_t)28, SEEK_SET); // od 28 bajtu liczba bajtow na piksel - 2 bajtowa dana
nread = read (fd1, buf_naglowek, 2);
for (i=1;i>=0;i--)
l_pix=l_pix<<8 | (int) buf_naglowek[i];
printf(" szerokosc obrazka= %d \n wysokosc obrazka = %d \n liczba bitow na piksel = %d \n wilekosc pliku = %d bajtow \n",szerokosc, wysokosc, l_pix, w_pliku);
bufsize = szerokosc * l_pix / 8;
- unsigned char bufor[bufsize]; * pamiec powinna byc przydzielona dynamicznie
bufor = malloc (bufsize * sizeof (unsigned char));
newpos = lseek (fd1, (off_t)54, SEEK_SET); // od 54 bajtu piksele obrazka (po 3 bajty na piksel) zaczynajac od ostaniej linii
par.sched_priority=priorytet1;
sched_setparam(0,&par);
macierzysty = getpid();
buf->chce1=0;
buf->chce2=0;
buf->kto_czeka=1;
// Potomny1
pid = fork();
if (pid==0)
{
potomny1 = getpid();
par.sched_priority=pp1;
sched_setparam(0,&par);
printf("PID procesu1 = %d\n",potomny1);
// Potomny 2
pid = fork();
if (pid==0)
{
potomny2 = getpid();
par.sched_priority=pp2;
sched_setparam(0,&par);
printf("PID procesu2 = %d\n",potomny2);
}
}
if (getpid()==potomny1)
{
while (z<=wysokosc)
{
buf->chce1=1;
buf->kto_czeka=1;
while ((buf->kto_czeka==1) &&( buf->chce2==1))
{
}
nread = read (fd1, bufor, bufsize); //odczytaj linie do bufora
newpos = lseek (fd1, -nread, SEEK_CUR); // cofnij sie o ile odczytane
buf->chce1=0;
for (i=0; i<szerokosc; i++)
{
bufor[(3*i)]=255-bufor[3*i];
bufor[(3*i)+1]=255- bufor[3*i+1];
bufor[(3*i)+2]=255- bufor[3*i+2];
}
z++;
buf->chce1=1;
buf->kto_czeka=1;
while ((buf->kto_czeka==1) &&( buf->chce2==1))
{
}
nwrite = write (fd1, bufor, (ssize_t)bufsize );
buf->chce1=0;
pp1 = rand()%priorytet3 + priorytet2 + 1;
par.sched_priority=pp1;
sched_setparam(0,&par);
sleep(0.9);
}
}
if (getpid()==potomny2)
{
while (z<=wysokosc)
{
buf->chce2=1;
buf->kto_czeka=2;
while (buf->kto_czeka==2 && buf->chce1==1)
{
}
nread = read (fd1, bufor, bufsize); //odczytaj linie do bufora
newpos = lseek (fd1, -nread, SEEK_CUR); // cofnij sie o ile odczytane
buf->chce2=0;
for (i=0; i<szerokosc; i++)
{
bufor[(3*i)]=255-bufor[3*i];
bufor[(3*i)+1]=255- bufor[3*i+1];
bufor[(3*i)+2]=255- bufor[3*i+2];
}
z++;
buf->chce2=1;
buf->kto_czeka=2;
while (buf->kto_czeka==2 && buf->chce1==1)
{
}
nwrite = write (fd1, bufor, (ssize_t)bufsize );
buf->chce2=0;
}
pp2 = rand()%priorytet5 + priorytet5 + 1;
par.sched_priority=pp2;
sched_setparam(0,&par);
sleep(0.9);
}
if(pid!=0)
{
wait (&stat);
shm_unlink("bufo");
printf("macierzysty = %d\n",macierzysty);
}
exit(0);
}