Semafory

0

Zaczynam pisać program z semaforami i na początku natrafiłem na pewien problem.
Chciałem stworzyć semafor, a następnie wypisać jego aktualną wartość.
Mój kod wygląda tak:

	sem_t *sem1;
	int *value;
	sem1=sem_open("semafor", O_CREAT | O_EXCL, 0644, 1);
	sem_getvalue(sem1, value);
	printf("Wartosc semafora to %d\n", value);

I tutaj moim problemem jest to, że po pierwsze przy kompilacji wyskakuje ostrzeżenie przy ostatniej linijce, dokładniej dotyczące "%d" (kompilator sugeruje "%ls"). Po uruchomieniu programu nic właściwie się nie dzieje, ponieważ wyskakuje komunikat o naruszeniu ochrony pamięci i oczywiście jego zakończenie.
Jest to mój pierwszy kontakt z semaforami, czytałem o tym dużo, jednak nie potrafię poradzić sobie z tym problemem, także proszę o wytłumaczenie, na czym polega mój błąd :)
Z góry dziękuję za pomoc :)

1

To nie ma się nijak do semaforów, tylko do podstaw programowania: wskaźnik value na nic nie wskazuje.

    sem_t *sem1;
    int value;
    sem1=sem_open("semafor", O_CREAT | O_EXCL, 0644, 1);
    sem_getvalue(sem1, &value);
    printf("Wartosc semafora to %d\n", value);
0

Po dokonaniu powyższych zmian problem z naruszeniem ochrony pamięci nie znika

0

U mnie działa.

0

W takim razie w czym może tkwić problem? Dla pewności przekopiowałem kod, także nie ma mowy o pomyłce. Wynik wciąż taki sam

0

Może go nie kompilujesz? Debugger w rękę i do dzieła, sprawdź chociaż gdzie się wywala.

0

Nigdy z tego nie korzystałem, teraz próbowałem zobaczyć co i jak, ale jedyne, co potrafię z tego wyciągnąć to to, że jest wysyłany sygnał sigsegv, czyli raczej nic nowego

0

Po ponownym uruchomieniu komputera program zadziałał raz, a przy próbie jego ponownego uruchomienia (nie dokonując żadnych zmian w kodzie), ponownie wyskakuje naruszenie ochrony pamięci i tak dzieje się już cały czas. Wiem, że wykonuje się pierwsze linijka (z sem_open), natomiast próba pobrania wartości semafora kończy się takim właśnie błędem. Czym może być to spowodowane, biorąc pod uwagę, że raz program zadział?

0

a co zwraca sem_open?

0

sem_open ma zwracać adres do semafora, tak?
Przy każdym ponownym uruchomieniu komputera za pierwszym razem program działa, za każdym kolejnym wyskakuje komunikat o naruszeniu ochrony pamięci :/

1

ja napisał @kq użyj debugera w celu zobaczenia co się dzieje w programie, zagaduje że za drugim razem jest zwracane 0 zamiast adresu. Czy przypadkiem w opisie do funkcji sem_open nie ma czegoś o funkcji sem_close()?

0

Całość wygląda tak:

	sem_t *sem1;
	int value;
	sem1=sem_open("semafor", O_CREAT | O_EXCL, 0644, 1);
	printf("Tekst\n");
	sem_getvalue(sem1, &value);
	printf("Kolejny tekst\n");
	printf("Wartosc poczatkowa semafora to %d\n", value);
	sem_close(sem1);

"Tekst" się wyświetla, natomiast "Kolejny tekst" już nie

1

Jeden z błędów zwracanych przez funkcję:

EEXIST Both O_CREAT and O_EXCL were specified in oflag, but a semaphore with this name already exists.

http://man7.org/linux/man-pages/man3/sem_open.3.html
Dodaj sprawdzanie zwracanych wartości.

0

Dobra, już działa, dziękuję bardzo za pomoc :)

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