我手头有 Linux 2.6.27.8 的源代码,因为我目前正在嵌入式 ARM 目标上进行驱动程序开发。
第 934 行的文件 ...linux-2.6.27.8-lpc32xx/net/ipv4/raw.c 包含例如
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));
哪个输出
[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
...
在函数raw_sock_seq_show() 中,它是procfs 处理函数层次结构的一部分。在对/proc/net/tcp 文件发出read() 请求之前不会生成文本,这是一种合理的机制,因为procfs 读取肯定比更新信息少得多。
某些驱动程序(例如我的)使用单个 sprintf() 实现 proc_read 函数。核心驱动程序实现中的额外复杂性是处理可能非常长的输出,这些输出在单次读取期间可能不适合中间的内核空间缓冲区。
我使用一个使用 64K 读取缓冲区的程序对此进行了测试,但它在我的系统中产生了一个 3072 字节的内核空间缓冲区,以便 proc_read 返回数据。需要使用前进指针进行多次调用才能获得超过返回的文本。当需要多个 i/o 时,我不知道使返回的数据保持一致的正确方法是什么。当然/proc/net/tcp 中的每个条目都是自洽的。并排的线条有可能是不同时间的快照。