Witajcie mam taki program jednak za kazdym razem w kolejce procesów zwracana jest wartość -1. Czuje, że blad lezy w KLUCZU DOSTEPU do semafora
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include<sys/sem.h>
#include<sys/types.h>
#include<unistd.h>
#include "biblioteka.h"
union semun
{
int value; // wartosc SETVAL
struct semid_ds *buf; // bufor pamieci wspolnej
ushort *array; // tablica do przekazywania wartosci dla semaforow
};
// funkcja semun - sterowanie
//--------------------------------------------------------------------------------------------
void wartosc(int semid)
{
union semun x;
x.value=2;
semctl(semid,0,SETVAL,x); //semafor o nr semnum =0; inicjowany wartoscia SETVAL od arg x
}
// inicjacja wartosci semafora
//--------------------------------------------------------------------------------------
int create(key_t key)
{
int semid;
semid= semget(key,0,IPC_CREAT|0666);
return semid;
}
// tworzymy semafor
//---------------------------------------------------------------------------------------
void zwieksz(int semid) // podniesienie = zwolnienie semafora
{
struct sembuf operacje={0,1,IPC_NOWAIT}; // 0- nr semafora / 1 - operacja V zwalnianie / 0- op. blok.
semop(semid, &operacje, 1);
}
//--------------------------------------------------------------------------------------------
void leave(int semid) // opuszczenie = zajecie semafora
{
struct sembuf operacje={0,-1,0}; // kolejnosc operacji : 0- numer semafora / -1 to operacje zajmowania semafora / 0 - operacja blokujaca
semop(semid,&operacje,-1);
}
//------------------------------------------------------------------------------------------
void sdelete(int semid)
{
printf("Usuwam semafor\n");
semctl(semid,0,IPC_RMID); // 0 - nr semafora, RMID- polecenie usuniecia danego zbioru
}
//----------------------------------------------------------------------------------------------------
key_t acces()
{
key_t key;
key= ftok("./powiel",getpid()); // getpid zwraca wartosc PID procesu
return key;
}
//------------------------------------------------------------------------------------------
int kolejka(int semid)
{
int numer;
numer = semctl(semid,0,GETZCNT); // odczyta liczbe procesow czekajacych na opuszczenie semafora
return numer;
}
int main()
{
int semid;
int argument;
int parametr; // liczba sygnalow która zostanie wykonana
key_t key;
printf("Wprowadz parametr w przedziale 0-2 do wykonania:\n");
scanf("%i", ¶metr);
if (parametr>=3 ) // system obslugi procesu do semafora
{
printf("Błędna liczba parametrów\n");
fprintf(stderr,"Koniec dzialania.\n"); //stderr to standardowe wyjscie bledow
exit(1);
}
if(parametr==0)
{
printf("otrzymalem pierwszy parametr\n");
}
else if((parametr==1) || (parametr==2))
{
printf("otrzymalem parametr numer dwa\n");
}
else
{
printf("Otrzymalem parametr wiekszy od 2 \n");
exit(1);
}
printf("Informuje o tworzeniu semafora\n");
key= acces(); //pobranie klucza dostepu
semid= create(key); //tworzenie semafora
wartosc(semid); //nadanie wartosci
printf("utworzylem semafor i nadalem mu wartosc\n\n");
do
{
switch(fork())
{
case -1:
perror("blad funkcji fork\n");
exit(1);
case 0:
printf("proces potomny: %d\n", getpid());
execl("./powielaj","powiel",NULL); // uruchamia powielacz (exec-sciezka pliku/nazwa programu"ARG[0]/ "arg wywoalania"
break;
default:
sleep(6);
break;
}
argument++;
} while(argument < parametr);
sdelete(semid); // usuwam semafor
printf("Koniec, semafor usuniety\n");
}
powiel, jako drugi program dziala porpawnie, chyba - ze tam tkwi problem funkcje chcialem zalaczyc w bibliotece.h wiec sa identyczne dla POWIEL.C jak i tego pliku co dolaczylem. Dolaczony plik to funkcja main. Ogolnie nie oczekuje gotowej odpowiedzi ( ale taka mile widziana ), ale naprowadzenia mnie jak to naprawic lub co jest zlego. Dziekuje za poswiecony czas na przeczytanie i pomoc !