• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Systemy operacyjne C /Semafor dostęp

Object Storage Arubacloud
0 głosów
846 wizyt
pytanie zadane 13 maja 2015 w C i C++ przez Wiciorny Ekspert (269,710 p.)

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", &parametr);
	
	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 ! 

1 odpowiedź

0 głosów
odpowiedź 16 maja 2015 przez dania9 Początkujący (260 p.)
Problem jest  w  kluczu  dostępu  samefora .
komentarz 16 maja 2015 przez Wiciorny Ekspert (269,710 p.)
Tyle to wiem- tylko nie jestem wstanie znaleźć tego błędu ...

Podobne pytania

0 głosów
1 odpowiedź 295 wizyt
0 głosów
0 odpowiedzi 243 wizyt
pytanie zadane 13 kwietnia 2019 w C i C++ przez hidden55 Początkujący (270 p.)
0 głosów
0 odpowiedzi 179 wizyt
pytanie zadane 8 listopada 2022 w Java przez CanoNee Nowicjusz (230 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...