Jestem trochę zdezorientowany przez Linux API sem_unlink(), głównie kiedy i dlaczego go wywołać. Używałem semaforów w Windows od wielu lat. W systemie Windows po zamknięciu ostatniego uchwytu nazwanego semafora system usuwa bazowy obiekt jądra. Ale pojawia się w Linuksie ty, programista, musisz usunąć obiekt jądra, wywołując sem_unlink(). Jeśli nie, obiekt jądra działa w folderze/dev/shm.Kiedy wywołać sem_unlink()?
Problem, który napotykam, jeśli proces A wywoła sem_unlink(), podczas gdy proces B ma semafor zablokowany, natychmiast niszczy semafor, a teraz proces B nie jest już "chroniony" przez semafor, gdy/jeśli proces C przychodzi. Co więcej, strona man jest w najlepszym razie myląca:
"Nazwa semafora jest natychmiast usuwana, semafor jest niszczony, gdy wszystkie inne procesy, które mają semafor, otwierają go."
W jaki sposób może on natychmiast zniszczyć obiekt, jeśli musi czekać na zamknięcie semafora w innych procesach?
Najwyraźniej nie rozumiem właściwego wykorzystania obiektów semaforów w systemie Linux. Dzięki za pomoc. Poniżej znajduje się przykładowy kod, którego używam do testowania tego.
int main(void)
{
sem_t *pSemaphore = sem_open("/MyName", O_CREAT, S_IRUSR | S_IWUSR, 1);
if(pSemaphore != SEM_FAILED)
{
if(sem_wait(pSemaphore) == 0)
{
// Perform "protected" operations here
sem_post(pSemaphore);
}
sem_close(pSemaphore);
sem_unlink("/MyName");
}
return 0;
}
Myślę, że źle czytasz stronę podręcznika. "Nazwa semafora jest natychmiast usuwana" oznacza dosłownie to, co mówi - nazwa jest usuwana, aby żadne dalsze procesy nie miały dostępu do semafora o tej nazwie. Nie oznacza to, że semafor zostanie usunięty, tylko nazwa.Drugie zdanie opisuje, kiedy semafor został usunięty - po każdym procesie, który obecnie go otworzył, zamknął go. – twalberg
Tak więc domyślam się, że pojawia się pytanie, w którym momencie wywołasz sem_unlink() w celu usunięcia semafora? Wydaje się, że jedynym sposobem zapewnienia, że działa to poprawnie, jest pozostawienie semafora w nieskończoność w systemie. To wygląda na niechlujne programowanie, ale nie widzę innego rozwiązania. – user2124642
Myślę, że pomysł polega na usunięciu go w dowolnym momencie, w którym zdecydujesz, że nie chcesz, aby nowe procesy mogły się do niego przyczepić. System zezwala na procesy, które są już dołączone, aby kontynuować działanie, a jedynie śmieci zbierają zasoby, gdy ostatni aktywny użytkownik zniknie. Nie oceniam, czy jest to "niechlujne", czy nie, ale należy pamiętać, że jest to raczej stary interfejs/interfejs API, więc może nie być "idealny" według dzisiejszych standardów, ale nadal działa na to, co było Przeznaczony dla, i dlatego nadal jest przydatny. – twalberg