Untuk hitungan proses saat ini, Anda dapat menggunakan getrlimit
untuk mendapatkan batas deskriptor file, lalu ulangi semua bilangan bulat dari 0 hingga batas tersebut dan coba panggil fcntl
dengan F_GETFD
memerintah. Ini hanya akan berhasil pada deskriptor file yang benar-benar terbuka, membiarkan Anda menghitungnya.
Edit: Saya sekarang memiliki cara yang lebih baik untuk melakukannya. Setelah mendapatkan rlimit
, buat array besar struct pollfd
(sebesar batas jika memungkinkan; jika tidak, Anda dapat memecahnya menjadi beberapa proses/panggilan) dengan masing-masing fd dalam rentang dan events
anggota disetel ke 0. Panggil poll
pada larik dengan batas waktu 0, dan cari POLLNVAL
bendera di revents
untuk setiap anggota. Ini akan memberi tahu Anda mana di antara kumpulan fd yang berpotensi besar yang tidak valid dengan satu syscall, bukan satu syscall per fd.
Anda dapat membaca /proc/sys/fs/file-nr
untuk menemukan jumlah total pegangan sistem file yang dialokasikan dan gratis serta jumlah maksimum yang diizinkan.
[[email protected] proc]# cat /proc/sys/fs/file-nr
3853 908 53182
| | |
| | |
| | max: maximum open file descriptors
| free: total free allocated file descriptors
allocated: total allocated file descriptors since boot
Untuk menghitung angka yang sedang digunakan, cukup lakukan allocated - free
. Anda juga dapat menghitung persentase deskriptor yang digunakan dengan melakukan ((allocated - free) / max) * 100
Mengenai per proses, saya tidak yakin apakah ada cara terprogram yang dapat Anda lakukan.
Berikut tutorial tentang cara melakukannya dengan lsof
pokoknya:http://linuxshellaccount.blogspot.com/2008/06/finding-number-of-open-file-descriptors.html
Karena Anda mengatakan Anda menggunakan Linux, Anda dapat membuka folder /proc/self/fd/
yang harus berisi tautan simbolis ke semua deskriptor file yang terbuka .