Şu anda gömülü bir ARM hedefinde sürücü geliştirme yaptığım için Linux 2.6.27.8 için kullanışlı bir kaynağım var.
linux-2.6.27.8-lpc32xx/net/ipv4/raw.c
934 satırındaki ... dosya
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));
hangi çıktılar
[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
...
işlevinde raw_sock_seq_show()
bir hiyerarşinin parçası olan procfs fonksiyonlarını ele. Procfs okumaları bilgileri güncellemekten çok daha az yaygın olduğundan read()
, /proc/net/tcp
dosya bir istek yapılana kadar metin üretilmez .
Bazı sürücüler (benimki gibi) proc_read işlevini tek bir sürücü ile uygular sprintf()
. Çekirdek sürücüler uygulamasındaki ekstra komplikasyon, tek bir okuma sırasında ara, çekirdek-boşluk tamponuna sığmayabilecek potansiyel olarak çok uzun çıktıları ele almaktır.
Ben bir 64K okuma tamponu kullanarak bir program ile test ama proc_read veri döndürmek için benim sistemde 3072 bayt bir çekirdek alanı tampon sonuçlanır. İade edilen bu metinden daha fazlasını elde etmek için ilerleyen işaretçilerle birden fazla çağrı yapılması gerekir. Birden fazla g / Ç gerektiğinde döndürülen verileri tutarlı hale getirmenin doğru yolunun ne olduğunu bilmiyorum. Şüphesiz ki, her giriş /proc/net/tcp
kendiliğinden tutarlıdır. Yan yana satırların farklı zamanlarda anlık görüntü olma olasılığı vardır.