また

また

私は時々Redisデータベースに接続するCプログラムを実行しています。数時間プログラムを実行した後、「ソケットを作成できませんでした:開いているファイルが多すぎます」というメッセージが表示されます。私はデータベースの論理部分を完了するたびに接続を閉じると確信しています。もしそうなら、Cプログラムの実行中にいくつのソケットを作成したかどうかを知る方法があるのだろうか。 Ubuntu 16.04を使用しています。

答え1

オペレーティングシステムを指定しておらず、/proc/*/fd/すべてのオペレーティングシステムには存在しません。

実際にプロセスで現在開いているすべてのファイル記述子を一覧表示する必要があります。これにより、実際に漏れている内容を確認できます。リークされるソケットファイル記述子は必ずしも必要ではありません。

FreeBSD、NetBSD、OpenBSDで…

...そしてさまざまな派生製品(例:TrueOS、DragonFly BSD)。

オプションと関連プロセスIDとfstat一緒にコマンドを使用してください。-p

fstat -p 718

  • fstatNetBSD 共通コマンドマニュアル。 2013年12月15日。

AIXでは

名前を印刷するオプションprocfilesと一緒にこのコマンドを使用します。-n

プロファイル-n 6679

  • procfilesオペレーティングシステム7.2。 IBM Knowledge Center。

オープンソラリスで...

...したがって、IllumosについてSchilix et al。

使用pfilesコマンド:

pfiles13253

  • pfilesユーザーコマンド。 SunOS 10.5 マニュアル。 2008年12月10日。

Linuxで

同様にコマンドを使用してくださいlsof

lsof -p 41467

また

私のC ++プログラムでファイル記述子を所有し、そのデストラクタでそれを閉じる単純なクラスは驚くべき効果を発揮します。残念ながら、__attribute__(__cleanup__)Cプログラムでこれを達成するには、GNU固有の言語拡張(たとえば)に依存する必要があります。

もちろん、他のツールを使用してさらに一歩進めることもできます。 DTraceと適切なスクリプトを使用すると、ファイル記述子を開閉するときにプロセスを監視できます。 (trussまたはktraceまたはを使用してこれを行うこともできます。作成するstraceシステムコールのサブセットを選択するメカニズムは非常に基本的または存在しませんが、デバッガといくつかの適切なブレークポイントを使用してこれを実行することもできます。)

答え2

システムレベルでは、プログラムがどの言語で書かれたのかはよくありません。

これを見ると、/proc/«pid»/fdプロセスが開いているファイル記述子の総数(ソケットだけでなく)がわかりますが、これはおおよその数値です。たぶん、他の人がソケットについて話すことができます。

straceまた、これを使用してプロセスで実行されたシステムコールを追跡することもできます。strace «my-program» «program args…»

プログラムでは

ソケットを開いて閉じるときに、ログファイルにいくつかのログをprintfに追加します。

関連情報