2012-11-09 10 views
5

Durante la lettura da un socket (non stream) in Linux, è possibile ottenere il timestamp (generato dall'hardware) dell'ultimo messaggio ricevuto tramite ioctl(sock, SIOCGSTAMP, &tv). Tuttavia, questo pone due problemi:Socket reading and timestamps

  • è un altro syscall (Ricevo circa 24000 messaggi al secondo, in modo che ogni chiamata di sistema è a notifica)
  • Se si utilizza questo metodo, posso solo read() un messaggio alla ora, seguito da ioctl() per ottenere il timestamp. (Se sto leggendo più di un messaggio in una read() -call, il seguente ioctl cede solo il timestamp dell'ultimo messaggio.)

La mia domanda è come ottenere la ricezione di messaggi e le loro timestamp nel minor numero di chiamate di sistema il più possibile Sarebbe perfetto se ci fosse un syscall con semantica come "leggi quanti messaggi sono in sospeso e i loro timestamp".

+1

Hai trovato una soluzione al tuo problema syscall? –

+1

La soluzione accettata di seguito è una soluzione; succede solo che non potrei usarlo a causa della mia vecchia versione del kernel. – pmf

risposta

6

Utilizzare la chiamata di sistema recvmmsg(2), se disponibile con il kernel, e impostare l'opzione SO_TIMESTAMP.

+1

Ah, ho solo mai incontrato recvmsg, non recvmmsg. Grazie! – pmf