Shell
有什麼方法可以知道 C 程序創建了多少個套接字?
我一直在執行一個 C 程序,它每隔一段時間就會連接到一個 Redis 數據庫。執行程序幾個小時後,它顯示“無法創建套接字:打開的文件太多”。我很確定每次完成數據庫中的邏輯部分後我都會關閉連接。所以我想知道是否有任何方法可以知道 C 程序在執行時創建了多少個套接字?我正在使用 Ubuntu 16.04。
您沒有指定作業系統,並且
/proc/*/fd/
並非在所有作業系統上都存在。您實際上需要列出該程序的所有目前打開的文件描述符,您可以從中確定實際洩漏的內容。洩漏的不一定是套接字文件描述符。
在 FreeBSD、NetBSD、OpenBSD …
……以及它們的各種衍生產品(例如 TrueOS、DragonFly BSD)。
使用
fstat
帶有-p
選項和相關程序 ID 的命令:fstat -p 718
fstat
. NetBSD 通用命令手冊。2013 年 12 月 15 日。在 AIX 上
procfiles
類似地使用該命令,並帶有-n
列印名稱的選項:過程文件-n 6679
procfiles
. AIX 7.2。IBM 知識中心。在 OpenSolaris 上……
……因此在 Illumos、Schillix 等人身上。
使用
pfiles
命令:文件 13253
pfiles
. 使用者命令。SunOS 10.5 手冊。2008 年 12 月 10 日。在 Linux 上
類似地使用
lsof
命令:lsof -p 41467
此外
在我的 C++ 程序中,一個擁有文件描述符並在其解構子中關閉它的簡單類可以創造奇蹟。不幸的是,您必須求助於 GNU 特定的語言擴展(即
__attribute__(__cleanup__)
)才能在 C 程序中實現這一點。您當然可以使用其他工具走得更遠。使用 DTrace 和合適的腳本,您可以在程序打開和關閉文件描述符時對其進行監控。(您也可以使用
truss
、 或ktrace
或來執行此操作strace
;儘管它們選擇系統呼叫子集的機制相當基本或不存在。您也可以使用調試器和一些合適的斷點來執行此操作。)