Tôi có sẵn nguồn cho Linux 2.6.27.8 vì hiện tại tôi đang phát triển trình điều khiển cho mục tiêu ARM nhúng.
Tệp ... linux-2.6.27.8-lpc32xx/net/ipv4/raw.c
ở dòng 934 chứa, ví dụ
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));
đầu ra nào
[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
...
trong chức năng raw_sock_seq_show()
là một phần của hệ thống phân cấp các chức năng xử lý Procfs . Văn bản không được tạo cho đến khi một read()
yêu cầu được tạo ra từ /proc/net/tcp
tệp, một cơ chế hợp lý vì các lần đọc của Procfs chắc chắn ít phổ biến hơn nhiều so với việc cập nhật thông tin.
Một số trình điều khiển (chẳng hạn như của tôi) triển khai chức năng Proc_read bằng một sprintf()
. Sự phức tạp thêm trong việc triển khai trình điều khiển lõi là xử lý đầu ra rất dài có thể không phù hợp với bộ đệm không gian nhân trung gian trong một lần đọc.
Tôi đã thử nghiệm rằng với một chương trình sử dụng bộ đệm đọc 64K nhưng kết quả là bộ đệm không gian kernel có 3072 byte trong hệ thống của tôi để Proc_read trả về dữ liệu. Nhiều cuộc gọi với con trỏ tiến là cần thiết để nhận được nhiều hơn số văn bản được trả về. Tôi không biết cách nào đúng để làm cho dữ liệu được trả về nhất quán khi cần nhiều hơn một i / o. Chắc chắn mỗi mục trong /proc/net/tcp
là tự nhất quán. Có một số khả năng các dòng cạnh nhau được chụp nhanh tại các thời điểm khác nhau.