Podczas odczytu z gniazda (bez przesyłania strumieniowego) w systemie Linux można uzyskać sygnaturę czasową (wygenerowaną przez sprzęt) ostatniej odebranej wiadomości za pośrednictwem numeru ioctl(sock, SIOCGSTAMP, &tv)
. Jednak ta stwarza dwa problemy:Odczyt gniazda i sygnatury czasowe
- To kolejny syscall (ja dostaję około 24000 wiadomości na sekundę, więc każdy jest syscall zgłoszenia)
- W przypadku korzystania z tej metody, mogę tylko
read()
jedną wiadomość na czasie, a następnieioctl()
, aby uzyskać znacznik czasu. (Jeśli czytam więcej niż jedną wiadomość wread()
-Call, następująceioctl
daje tylko znacznik czasu ostatniej wiadomości.)
Moje pytanie brzmi, jak osiągnąć odbieranie wiadomości i ich znaczniki czasu w jak najmniejszej liczbie syscalli jak to możliwe. Byłoby idealnie, gdyby istniała syscall z semantyką typu "czytaj tyle wiadomości, ile oczekują i ich sygnatury czasowe".
Czy znalazłeś rozwiązanie swojego problemu z systemem operacyjnym? –
Zaakceptowane rozwiązanie poniżej jest rozwiązaniem; po prostu nie mogłem go użyć z powodu mojej bardzo starej wersji jądra. – pmf