私は時々Redisデータベースに接続するCプログラムを実行しています。数時間プログラムを実行した後、「ソケットを作成できませんでした:開いているファイルが多すぎます」というメッセージが表示されます。私はデータベースの論理部分を完了するたびに接続を閉じると確信しています。もしそうなら、Cプログラムの実行中にいくつのソケットを作成したかどうかを知る方法があるのだろうか。 Ubuntu 16.04を使用しています。
答え1
オペレーティングシステムを指定しておらず、/proc/*/fd/
すべてのオペレーティングシステムには存在しません。
実際にプロセスで現在開いているすべてのファイル記述子を一覧表示する必要があります。これにより、実際に漏れている内容を確認できます。リークされるソケットファイル記述子は必ずしも必要ではありません。
FreeBSD、NetBSD、OpenBSDで…
...そしてさまざまな派生製品(例:TrueOS、DragonFly BSD)。
オプションと関連プロセスIDとfstat
一緒にコマンドを使用してください。-p
fstat -p 718
fstat
。NetBSD 共通コマンドマニュアル。 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に追加します。