uogólnione operacje semaforowe

0

algorytm czytanie- pisanie z zastosowaniem semaforów uogólnionych:
czytanie-3
begin
repeat
PN (w,1);
czytanie;
VN(w,1);
end

pisanie-3
begin
repeat
PN(w,M);
pisanie
VN(w,M)
end

Proszę o sprawdzenie kodu:

////////////////////////////////////////////mainprog.c///////////////////////////////////////////


#include <stdio.h>
#include <string.h>
#include "operacje.h"
#include <sys/shm.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#define P 3
#define MAX 10
#define MAX2 12
int main()
{
key_t kls,klm;
int semID;
int N = 3;
int i;
int shmID;
if( (kls = ftok(".",'A')) == -1 ) { printf("Blad ftok (main)\n"); exit(1) ; }
semID = alokujSem(kls, N, IPC_CREAT | IPC_EXCL | 0666);
inicjalizujSem(semID, 0, 0);
inicjalizujSem(semID, 1, 1);
inicjalizujSem(semID, 2, 0);
printf("Semafor gotowy!\n");
klm=ftok(".",'B');
shmID=shmget(klm,MAX2*sizeof(int), IPC_CREAT|IPC_EXCL|0666);
if(shmID==-1) {printf("Blad shm\n"); exit(1);}
fflush(stdout);
for(i = 0; i < P; i++)
switch (fork())
{
case -1:
	perror("Blad fork (mainprog)");
	exit(2);
case 0:
	execl("./pisz","pisz", NULL );
}
for(i=0;i<P;i++)
switch(fork())
{
case -1:
	printf("Blad fork (mainprog)");
	exit(2);
case 0:
	execl("./czyt","czyt",NULL);
}
for(i=0;i<2*P;i++) wait(NULL);
zwolnijSem(semID,N);
shmctl(shmID,IPC_RMID,NULL);
printf("MAIN: KONIEC.\n");

}


///////////////////////////////////operacje.h////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/errno.h>
int alokujSem(key_t klucz, int number, int flagi);
void inicjalizujSem(int semID,int number,int val);
int zwolnijSem(int semID,int number);
int PN(int semID,int number, int n);
int VN(int semID,int number,int flags);

///////////////////////////////////operacje.c////////////////////////////////////
#include "operacje.h"
int alokujSem(key_t klucz, int number, int flagi)
{
	int semID;
	if( (semID = semget(klucz,number,flagi)) == -1) { perror("Blad semget (alokujSemafor): "); exit(1); }
	return semID;
}
int zwolnijSem(int semID, int number)
{
	return semctl(semID, number, IPC_RMID , NULL);

}
void inicjalizujSem(int semID, int number,int val)
{
	if (semctl(semID,number,SETVAL,val) == -1 ) { perror("Blad semctl (inicjalizujSemafor): "); exit(1); }

}
/*
int P(int semID,int number,int flags);
{
	struct sembuf operacje;
	operacje.sem_num = number;
	operacje.sem_op = -1;
	operacje.sem_flg = 0 | flags;//SEM_UNDO;
	if(semop(semID, &operacje , 1) == -1) { perror("Blad semop(P)"); return -1;}
	return 1;
}
int V(int semID,int number,int flags);
{
	struct sembuf operacje;
	operacje.sem_num = number;
	operacje.sem_op = 1;
	operacje.sem_flg = SEM_UNDO;
	if(semop(semID, &operacje , 1) == -1) { perror("Blad semop(V)"); return -1;}
	return 1;
}*/
int PN(int semID,int number, int n)
{
	struct sembuf operacje;
	operacje.sem_num = number;
	operacje.sem_op = -n;
	operacje.sem_flg = n;
	if(semop(semID, &operacje , 1) == -1) { perror("Blad semop(PN)"); return -1;}
	return 1;
}
int VN(int semID,int number,int n)
{
	struct sembuf operacje;
	operacje.sem_num = number;
	operacje.sem_op = n;
	operacje.sem_flg = n;
	if(semop(semID, &operacje , 1) == -1) { perror("Blad semop(VN)"); return -1;}
	return 1;
}
///////////////////////////////////czyt.c////////////////////////////////////
#include <stdio.h>
#include "operacje.h"
#include <sys/types.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <time.h>
#define MAX 10
#define MAX2 12
int main()
{
	key_t kluczs,kluczm;
	int semID;
	int shmID;
	int *bufor;
	int N=3;
	int i;
	int semnumer;
	int M=1;
	printf("czytajacy----------------\n");
	if((kluczs = ftok(".",'A')) == -1 ) { printf("Blad ftok (A) \n"); exit(2); }
	semID = alokujSem(kluczs, N, IPC_CREAT |0666);
	if(semID == -1){ printf("blad semafora - producent\n"); exit(1);}
	kluczm=ftok(".",'B');
	shmID=shmget(kluczm,MAX2*sizeof(int), IPC_CREAT | 0666 );
	if(shmID == -1) {printf("blad pamieci dzielonej\n"); exit(1);}
	bufor=(int*)shmat(shmID,NULL, 0);
	semnumer=1;
	int PN(semID,semnumer, M);
	printf("czytanie............\n");
	VN(semID,semnumer, M);
}



///////////////////////////////////pisz.c////////////////////////////////////

#include <stdio.h>
#include "operacje.h"
#include <sys/types.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <time.h>
#include <sys/sem.h>
#define MAX 10
#define MAX2 12
int main()
{
	key_t kluczs,kluczm;
	int semID;
	int shmID;
	int *bufor;
	int N=3;
	int i;
	int semnumer;
	int M=10;
	printf("piszacy----------------\n");
	if((kluczs = ftok(".",'A')) == -1 ) { printf("Blad ftok (A) \n"); exit(2); }
	semID = alokujSem(kluczs, N, IPC_CREAT |0666);
	if(semID == -1){ printf("blad semafora - producent\n"); exit(1);}
	kluczm=ftok(".",'B');
	shmID=shmget(kluczm,MAX2*sizeof(int), IPC_CREAT | 0666 );
	if(shmID == -1) {printf("blad pamieci dzielonej\n"); exit(1);}
	bufor=(int*)shmat(shmID,NULL, 0);
	semnumer=1;
	int PN(semID,semnumer, M);
	printf("pisanie............\n");
	VN(semID,semnumer, M);
}

Nie jestem pewien tej implementacji PN VN oraz plikow pisz.c i czyt.c

Proszę o pomoc

0

wydruk :

Semafor gotowy!
czytajacy----------------
czytanie............
czytajacy----------------
czytanie............
czytajacy----------------
czytanie............
piszacy----------------
piszacy----------------
piszacy----------------

( i zostaje w programie )

1 użytkowników online, w tym zalogowanych: 0, gości: 1