Zadatak 1:
Varijabilna veličina bafera i njegovo pražnjenje
UVESTI neophodne modifikacije u programe citac.c i pisac.c kojima se omogućuje:
zadavanje poruka koje će se upisati u bafer
varijabilna veličina bafera
čitanje zadatog broja poruka iz bafera i pražnjenje bafera (čitanje svih poruka koje su prisutne u baferu
Zadatak 2
DLL sa funkcijama za čitanje i pisanje
Napravite DLL sa funkcijama:
int upis( char *poruka) - upisivanje zadane poruke u bafer. Povratna vrijednost je 0 ako nije bilo greške.
int citanje( char *poruka, int maxduzina) - čitanje poruke i njeno smještanje u prostor određen parametrom poruka sa maksimalnom dužinom (veličinom poruke) određenom parametrom maxduzina. Povratna vrijednost je 0 ako nije bilo greške
int prazno() - vraća 0 ako je bafer prazan u momentu pozivanja
Ujedno, programe citac.c i pisac.c promijenite tako da koriste funkcije iz DLL.
PROGRAM CITAC.C JE SLJEDECI:
#include <windows.h>
#include <assert.h>
#include <stdio.h>
#define BufferSize 100
#define Buffers 10
static const char MemoryName[]="Share Memory Name";
static char * Memory[Buffers];
char * addr;
static const char WriterSemaphoreName[]="Writer Semaphore";
static const char ReaderSemaphoreName[]="Reader Semaphore";
static HANDLE hWriterSemaphore;
static HANDLE hReaderSemaphore;
static HANDLE hMemory;
int main(void)
{
int i;
hWriterSemaphore=CreateSemaphore(NULL,Buffers,Buffers,WriterSemaphoreName);
hReaderSemaphore=CreateSemaphore(NULL,0,Buffers,ReaderSemaphoreName);
hMemory=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0
,sizeof(char [Buffers][BufferSize]),MemoryName);
addr=MapViewOfFile(hMemory
,FILE_MAP_WRITE,0,0,sizeof(char [Buffers][BufferSize]));
for (i=0;i<Buffers;i++)
{
Memory=(char *)addr;
addr=addr+BufferSize;
}
for(i=0;;++i)
{
WaitForSingleObject(hReaderSemaphore,INFINITE);
puts(Memory[i%10]); // Reader reads data
ReleaseSemaphore(hWriterSemaphore,1,NULL);
}
UnmapViewOfFile(Memory);
CloseHandle(hWriterSemaphore); CloseHandle(hReaderSemaphore);
return 0;
}
PROGRAM PISAC.C JE SLJEDECI:
#include <windows.h>
#include <assert.h>
#include <stdio.h>
#define BufferSize 100
#define Buffers 10
static const char MemoryName[]="Share Memory Name";
static char * Memory[Buffers];
char * addr;
static const char WriterSemaphoreName[]="Writer Semaphore";
static const char ReaderSemaphoreName[]="Reader Semaphore";
static HANDLE hWriterSemaphore;
static HANDLE hReaderSemaphore;
static HANDLE hMemory;
int main(void)
{
int i;
hWriterSemaphore=CreateSemaphore(NULL,Buffers,Buffers,WriterSemaphoreName);
hReaderSemaphore=CreateSemaphore(NULL,0,Buffers,ReaderSemaphoreName);
hMemory=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0
,sizeof(char [Buffers][BufferSize]),MemoryName);
addr=MapViewOfFile(hMemory
,FILE_MAP_WRITE,0,0,sizeof(char [Buffers][BufferSize]));
for (i=0;i<Buffers;i++)
{
Memory=(char *)addr;
addr=addr+BufferSize;
}
for(i=0;;++i)
{
WaitForSingleObject(hWriterSemaphore,INFINITE);
printf("Writing to Buffer %i\n",i);
wsprintf(Memory[i%10],"This is the writer - %i\n",i);
Sleep(1000);
ReleaseSemaphore(hReaderSemaphore,1,NULL);
}
UnmapViewOfFile(Memory);
CloseHandle(hWriterSemaphore); CloseHandle(hReaderSemaphore);
return 0;
}