Semafory

H5
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 4 lata
  • Postów:66
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:

Kopiuj
	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 :)

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 13 godzin
  • Lokalizacja:Szczecin
1

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

Kopiuj
    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);

H5
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 4 lata
  • Postów:66
0

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

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 13 godzin
  • Lokalizacja:Szczecin
0

U mnie działa.


H5
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 4 lata
  • Postów:66
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

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 13 godzin
  • Lokalizacja:Szczecin
0

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


H5
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 4 lata
  • Postów:66
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

rrowniak
Debugger to nie taka straszna rzecz, nawet gdb w trybie tekstowym. Zrobiłem kiedyś krótki poradnik dla początkujących (będziesz miał tam przykład z segfaultem): http://rrowniak.com/programming/gdb-na-linuksie-czyli-jak-ujarzmic-swoj-kod/
H5
Dziękuję, poczytam o tym :)
H5
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 4 lata
  • Postów:66
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ł?

Miang
  • Rejestracja:około 7 lat
  • Ostatnio:5 minut
  • Postów:1677
0

a co zwraca sem_open?


dzisiaj programiści uwielbiają przepisywać kod z jednego języka do drugiego, tylko po to by z projektem nadal stać w miejscu ale na nowej technologii
H5
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 4 lata
  • Postów:66
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 :/

Miang
  • Rejestracja:około 7 lat
  • Ostatnio:5 minut
  • Postów:1677
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()?


dzisiaj programiści uwielbiają przepisywać kod z jednego języka do drugiego, tylko po to by z projektem nadal stać w miejscu ale na nowej technologii
H5
Na końcu mam linijkę sem_close(sem1), jednak niczego ona w tej kwestii nie zmienia :/
Delor
'Na końcu' to znaczy gdzie? Wykonuje się czy może błąd jest wcześniej? Daj obszerniejszy fragment kodu bo to trochę błądzenie na ślepo.
H5
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 4 lata
  • Postów:66
0

Całość wygląda tak:

Kopiuj
	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

edytowany 2x, ostatnio: hidden55
Delor
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 2 lata
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.

H5
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 4 lata
  • Postów:66
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.