Ho a portata di mano il sorgente per Linux 2.6.27.8 poiché sto attualmente sviluppando driver su un target ARM incorporato.
Il file ... linux-2.6.27.8-lpc32xx/net/ipv4/raw.c
alla riga 934 contiene, ad esempio
seq_printf(seq, "%4d: %08X:%04X %08X:%04X"
" %02X %08X:%08X %02X:%08lX %08X %5d %8d %lu %d %p %d\n",
i, src, srcp, dest, destp, sp->sk_state,
atomic_read(&sp->sk_wmem_alloc),
atomic_read(&sp->sk_rmem_alloc),
0, 0L, 0, sock_i_uid(sp), 0, sock_i_ino(sp),
atomic_read(&sp->sk_refcnt), sp, atomic_read(&sp->sk_drops));
quali uscite
[wally@zenetfedora ~]$ cat /proc/net/tcp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
0: 017AA8C0:0035 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 15160 1 f552de00 299
1: 00000000:C775 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 13237 1 f552ca00 299
...
nella funzione raw_sock_seq_show()
che fa parte di una gerarchia di funzioni di gestione dei processi . Il testo non viene generato fino a quando non read()
viene fatta una richiesta del /proc/net/tcp
file, un meccanismo ragionevole poiché le letture di procfs sono sicuramente molto meno comuni dell'aggiornamento delle informazioni.
Alcuni driver (come il mio) implementano la funzione proc_read con un singolo sprintf()
. La complicazione aggiuntiva nell'implementazione dei driver core è quella di gestire un output potenzialmente molto lungo che potrebbe non adattarsi al buffer intermedio dello spazio del kernel durante una singola lettura.
L'ho provato con un programma che utilizza un buffer di lettura da 64 KB, ma risulta in un buffer dello spazio del kernel di 3072 byte nel mio sistema affinché proc_read restituisca i dati. Sono necessarie più chiamate con puntatori di avanzamento per ottenere più di quel testo restituito. Non so quale sia il modo giusto per rendere coerenti i dati restituiti quando è necessario più di un I / O. Certamente ogni voce /proc/net/tcp
è autoconsistente. È probabile che le linee affiancate siano istantanee in momenti diversi.