2012-10-19 19 views
9

Pracuję nad serwerem w C z epoll library i mam pytanie, jak pamięć jest obsługiwana dla struct epoll_event. Zauważyłem w niektórych przykładach internetowych, że podczas dokonywania epoll_ctl połączenia, events argument alokowanych na stosie, a następnie wskaźnik jest przekazywana, tak:Obsługa pamięci za pomocą struct epoll_event

struct epoll_event ev; 
ev.events = EPOLLIN; 
epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd, &ev); 

Teraz wszyscy wiemy, co dzieje się, gdy ev funkcja zwraca. Moje pytanie brzmi: czy biblioteka epoll tworzy kopie tych wartości wewnętrznie, czy też opiera się na strukturze przekazanej do przydzielenia sterty? Czy powyższy przykład całkowicie złamie moją implementację reaktora? Jeśli tak, jaki jest najlepszy sposób na śledzenie moich struktur przydzielonych epoll_event sterty?

Dzięki za poświęcony czas.

+0

Jeśli "wszyscy wiemy, co się dzieje", dlaczego pytasz? –

+0

Kiedy mówię "wszyscy wiemy, co się dzieje" mam na myśli to, że pamięć przydzielona do stosu jest zwalniana, gdy funkcja zwraca. –

Odpowiedz

11

Wszystko w porządku. Funkcja epoll_ctl jest prostym opakowaniem wokół wywołania systemowego, które zostanie całkowicie ukończone po powrocie funkcji. Nie są wymagane żadne dodatkowe dane z przestrzeni użytkownika. Struktura jest po prostu sposobem na spakowanie argumentów.

7

Całkowicie dobrze jest natychmiast wyrzucić lub ponownie użyć struktury epoll_event.

Jądro skopiuje parametry z struktury epoll_event.

To jest dokładnie to samo, jeśli użyłeś ioctl, który przyjmuje struct jako parametr, lub operację gniazda (np. Bind), która pobiera struct sockaddr_in.

Jądro bierze to, czego potrzebuje, i od razu jest w porządku, aby go uwolnić.

Jedyne, czego należy się martwić, to "dane użytkownika", które są istotne tylko dla użytkownika. Jądro to zapamięta, ale musisz wiedzieć, co to znaczy, gdy dostaniesz wydarzenie.

+0

Dziękuję. Rewizja. Zaznaczę jednak odpowiedź Kerreka SB, ponieważ odpowiedział około minuty przed tobą. –

3

epoll to zestaw syscalls, a nie biblioteka. Kiedy wywołujesz numery linii epoll, wpisujesz jądro, a jądro na ogół nie ufa tym buforom trybu użytkownika, które muszą być poprawne lub pozostają w kamerze, ale raczej kopiuje je do pamięci jądra poprzez copy_from_user itd. Więc tak, możesz skonfigurować struktury na stos, podaj jego adresy do syscall, a następnie odrzuć je po powrocie.

Powiązane problemy