[ djemo @ 26.04.2004. 19:57 ] @
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; } |