Semafory

Odpowiedz Nowy wątek
2019-04-13 01:54
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 :)

Pozostało 580 znaków

2019-04-13 02:04
kq
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);

Pozostało 580 znaków

2019-04-13 02:08
0

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

Pozostało 580 znaków

2019-04-13 02:11
kq
0

U mnie działa.


Pozostało 580 znaków

2019-04-13 02:16
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

Pozostało 580 znaków

2019-04-13 02:16
kq
0

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


Pozostało 580 znaków

2019-04-13 02:40
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

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/programmi[...]-czyli-jak-ujarzmic-swoj-kod/ - rrowniak 2019-04-13 08:31
Dziękuję, poczytam o tym :) - hidden55 2019-04-13 10:48

Pozostało 580 znaków

2019-04-13 12:25
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ł?

Pozostało 580 znaków

2019-04-13 12:45
0

a co zwraca sem_open?

Pozostało 580 znaków

2019-04-13 22:52
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 :/

Pozostało 580 znaków

2019-04-13 23:12
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()?

Na końcu mam linijkę sem_close(sem1), jednak niczego ona w tej kwestii nie zmienia :/ - hidden55 2019-04-13 23:15
'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. - Delor 2019-04-13 23:18

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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