У мене є джерело для Linux 2.6.27.8, оскільки я зараз займаюся розробкою драйверів для вбудованої цілі ARM.
Файл ... linux-2.6.27.8-lpc32xx/net/ipv4/raw.c
у рядку 934 містить, наприклад
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()
яка є частиною ієрархії функцій обробки profs . Текст не генерується, доки не read()
буде зроблений запит із /proc/net/tcp
файлу, розумний механізм, оскільки читання procfs , безумовно, набагато рідше, ніж оновлення інформації.
Деякі драйвери (такі як моя) реалізують функцію proc_read з єдиним sprintf()
. Додаткове ускладнення в реалізації основних драйверів полягає в обробці потенційно дуже довгого виходу, який може не поміститися в проміжний буфер ядра-простір під час одного зчитування.
Я перевірив це з програмою, що використовує 64K буфер зчитування, але це призводить до появи буфера простору ядра в 3072 байтів у моїй системі для proc_read для повернення даних. Для отримання більшого кількості поверненого тексту потрібно кілька дзвінків із вказівниками вперед. Я не знаю, який правильний спосіб зробити узгоджені дані послідовними, коли потрібно більше одного вводу-виводу. Безумовно, кожен запис у ньому /proc/net/tcp
є послідовним. Існує деяка ймовірність того, що рядки поруч є знімком у різний час.