Witam.
Potrzebuję rozwiązania problemu czytelników i pisarzy, przy użyciu semaforów oraz pamięci dzielonej, ale nie na wątkach!! Takie rozwiązanie już mam, lecz wymagane jest na procesach - chodzi o metodę z priorytetem dla pisarzy. Sam nie potrafię sobie z tym poradzić, a czas bardzo mnie goni. Może ktoś ma i mógłby się podzielić? Byłbym bardzo wdzięczny. Z góry dziękuję.

Dołączam rozwiązanie na wątkach - zasada działania musi być identyczna.

 //rozwiazanie z zaglodzeniem czytenikow
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>

#define L_PISARZY 20
#define L_CZYTELNIKOW 20

sem_t sp; 							//1 - jest wolne miejsce dla pisarza w czytelni
sem_t sc;							//1 - sa wolne miejsca dla czytelnikow
pthread_t pisarze[L_PISARZY]; 			//tablica watkow pisarzy
pthread_t czytelnicy[L_CZYTELNIKOW]; 	//tablica watkow czytelnikow
sem_t w1, w2, w3; 							//pomocnicze semafory
int lc = 0; 				//liczba czytelnikow w bibliotece
int lp = 0;					//liczba czytelnikow w bibliotece


void* pisarz (void* arg)
{
	int i, num = *((int*)arg);
	while(1)
	{
		sem_wait(&w2); 								//czeka na miejsce w kolejce pisarzy
		lp++;  										//staje w kolejce
		if(lp==1) sem_wait(&sc);  					//czeka az wyjdzie ostatni czytelnik
		printf("Pisarz %d czeka...\n", num);
		sem_post(&w2);
		sem_wait(&sp);							//czeka na mozliwosc zapisu
		printf("Pisarz %d pisze...\n", num);
		sleep(5);
		sem_post(&sp);	//konczy zapis
		sem_wait(&w2);
		lp--;  //wychodzi z czytelni
		if(lp==0) sem_post(&sc); //jezeli nie ma pisarzy w kolejce to mozna wpuszczac czytelnikow
		printf("Pisarz %d wyszedl...\n", num);
		sem_post(&w2);
		sleep(5);
	}
}


void* czytelnik (void* arg) 
{
	int num = *((int*)arg);
	while(1)
	{
		printf("Czytelnik %d czeka...\n", num);
		sem_wait(&w3);
		sem_wait(&sc); //czeka na mozliwosc czytania
		sem_wait(&w1);
		lc++;	//gotowy do wejscia
		if(lc == 1) sem_wait(&sp); //czeka az pisarze przestana pisac
		sem_post(&w1);
		sem_post(&sc); //zaprasza nastepnych czytelnikow
		sem_post(&w3);
		printf("Czytelnik %d czyta...\n", num);
		sleep(5);
		sem_wait(&w1);
		printf("Czytelnik %d wyszedl...\n", num);
		sleep(5);
		lc--;	//wychodzi z czytelni
		if(lc == 0) sem_post(&sp); //jezeli yszedl ostatni czytelnik to zaprasza rowniez pisarzy
		sem_post(&w1);
	}
}


int main () 
{
	int i, *num;
	sem_init(&sc, 0, 1);
	sem_init(&sp, 0, 1);
	sem_init(&w1, 0, 1);
	sem_init(&w2, 0, 1);
	sem_init(&w3, 0, 1);
	for (i = 0; i < L_PISARZY; i++) 
	{
		num = (int*)malloc(sizeof(int));
		*num = i;
		pthread_create(&pisarze[i], NULL, &pisarz, num);  //tworzenie watkow pisarzy
	}
	for (i = 0; i < L_CZYTELNIKOW; i++) 
	{
		num = (int*)malloc(sizeof(int));
		*num = i;
		pthread_create(&czytelnicy[i], NULL, &czytelnik, num); //tworzenie watkow czytelnikow 
	}
	for (i = 0; i < L_PISARZY; i++) pthread_join(pisarze[i], NULL);  		//oczekiwanie az wszyscy pisarze wroca z czytelni 
	for (i = 0; i < L_CZYTELNIKOW; i++) pthread_join(czytelnicy[i], NULL);  //oczekiwanie az wszyscy czytelnicy wroca z czytelni
}