2012-11-09 17 views
5

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ępnie ioctl(), aby uzyskać znacznik czasu. (Jeśli czytam więcej niż jedną wiadomość w read()-Call, następujące ioctl 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".

+1

Czy znalazłeś rozwiązanie swojego problemu z systemem operacyjnym? –

+1

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

Odpowiedz

6

Użyj wywołania systemowego, jeśli jest dostępne z jądrem i ustaw opcję SO_TIMESTAMP.

+1

Ach, spotkałem tylko recvmsg, a nie recvmmsg. Dzięki! – pmf