また

また

私は時々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システムコールのサブセットを選択するメカニズムは非常に基本的または存在しませんが、デバッガといくつかの適切なブレークポイントを使用してこれを実行することもできます。)

おすすめ記事