Tengo a mano la fuente de Linux 2.6.27.8, ya que actualmente estoy desarrollando controladores en un objetivo ARM incorporado.
El archivo ... linux-2.6.27.8-lpc32xx/net/ipv4/raw.c
en la línea 934 contiene, por ejemplo
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));
que salidas
[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
...
en la función raw_sock_seq_show()
que forma parte de una jerarquía de funciones de manejo de procfs . El texto no se genera hasta que una read()
petición es hecha del /proc/net/tcp
archivo, un mecanismo razonable, ya que procfs lee seguramente son mucho menos comunes que la actualización de la información.
Algunos controladores (como el mío) implementan la función proc_read con un solo sprintf()
. La complicación adicional en la implementación de los controladores centrales es manejar una salida potencialmente muy larga que puede no encajar en el búfer intermedio del espacio del núcleo durante una sola lectura.
Probé eso con un programa que usa un búfer de lectura de 64K pero da como resultado un búfer de espacio en el núcleo de 3072 bytes en mi sistema para que proc_read devuelva datos. Se necesitan múltiples llamadas con punteros avanzados para obtener más que ese texto devuelto. No sé cuál es la forma correcta de hacer que los datos devueltos sean consistentes cuando se necesita más de una E / S. Ciertamente, cada entrada /proc/net/tcp
es autoconsistente. Existe cierta probabilidad de que las líneas una al lado de la otra sean instantáneas en diferentes momentos.