Mam przydatne źródło dla Linuksa 2.6.27.8, ponieważ w tej chwili pracuję nad rozwojem sterowników w osadzonym celu ARM.
Na przykład plik ... linux-2.6.27.8-lpc32xx/net/ipv4/raw.c
w linii 934 zawiera
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));
które wyjścia
[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
...
w funkcji, raw_sock_seq_show()
która jest częścią hierarchii funkcji obsługujących procfs . Tekst nie jest generowany, dopóki plik nie read()
zostanie złożony /proc/net/tcp
, co jest rozsądnym mechanizmem, ponieważ odczyty procfs są z pewnością znacznie mniej powszechne niż aktualizowanie informacji.
Niektóre sterowniki (takie jak moje) implementują funkcję proc_read z pojedynczym plikiem sprintf()
. Dodatkową komplikacją związaną z implementacją podstawowych sterowników jest obsługa potencjalnie bardzo długich danych wyjściowych, które mogą nie zmieścić się w pośrednim buforze przestrzeni jądra podczas pojedynczego odczytu.
Przetestowałem to z programem używającym bufora odczytu 64K, ale w moim systemie pojawił się bufor przestrzeni jądra o wielkości 3072 bajtów, aby proc_read mógł zwrócić dane. Aby otrzymać więcej niż tyle zwróconego tekstu, potrzeba wielu wywołań z zaawansowanymi wskaźnikami. Nie wiem, jaki jest właściwy sposób, aby zwracane dane były spójne, gdy potrzebne jest więcej niż jedno wejście / wyjście. Z pewnością każdy wpis /proc/net/tcp
jest spójny. Istnieje pewne prawdopodobieństwo, że linie obok siebie są migawkami w różnym czasie.