Shell

有什麼方法可以知道 C 程序創建了多少個套接字?

  • March 14, 2019

我一直在執行一個 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

在 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;儘管它們選擇系統呼叫子集的機制相當基本或不存在。您也可以使用調試器和一些合適的斷點來執行此操作。)

引用自:https://unix.stackexchange.com/questions/506222