Linuxでのfd漏洩の位置づけ

5281 ワード

以前、会社で生産ツールを書いたことがあります.ある駆動ノードを読み書きすることで設備情報の変更機能を実現しました.結果、コピー機をテストして2時間も切らなければなりません.カーネル印刷を見ると「ファイルを開くのに失敗しました」と、perrorが印刷されてからファイルを開くのが多すぎて、fd(ファイル記述子)が漏れたと推測しました.fd漏洩はどういうことですか.linuxがファイルを開くのは通常openがfdを返す形式で、オペレーティングシステムは現在のプロセスがファイルを開く記録を維持しますが、数は制限されており、オペレーティングシステムが開くことができるfdの合計も限られています.プロセスが閉じずにファイルを開くと、openを呼び出すとオペレーティングシステムは失敗します.したがって、特にサービス型プロセスと常駐メモリのプロセスでは、ファイルを開くと、使用しないときに閉じることを忘れないでください.そうしないと、開くだけで閉じないと、ハンドルが漏れます.もちろんプロセスが終了すると、オペレーティングシステムは自分で回収fdを閉じるので、プロセスの実行時間が短いと終了し、開くfdが少なく、理論的には明示的に閉じなくてもよいが、closeを呼び出すのは良い習慣である.
/proc/pid/fd
/proc/pid/fdフォルダはLinuxにマウントされている現在開いているファイル記述子(fd)情報を記録しており、fdを開くたびにfdというファイル名のファイルが生成されます.
oujiangping at ubuntu in ~/project/test 
$ sudo ls /proc/3645/fd
0  1  10  11  12  2  3  4  5  6  7  8  9

位置
lsがfdの数が特に多いことを発見したら、fdが漏れたかどうかを考えなければなりません.詳細はlsofでご覧ください.
nm-applet 3645 oujiangping    0r      CHR                1,3      0t0        6 /dev/null
nm-applet 3645 oujiangping    1u      CHR              136,2      0t0        5 /dev/pts/2
nm-applet 3645 oujiangping    2u      CHR              136,2      0t0        5 /dev/pts/2
nm-applet 3645 oujiangping    3r      CHR                1,9      0t0       11 /dev/urandom
nm-applet 3645 oujiangping    4u     unix 0x0000000000000000      0t0    30080 type=STREAM
nm-applet 3645 oujiangping    5u  a_inode               0,11        0     9114 [eventfd]
nm-applet 3645 oujiangping    6u     unix 0x0000000000000000      0t0    30082 type=STREAM
nm-applet 3645 oujiangping    7u  a_inode               0,11        0     9114 [eventfd]
nm-applet 3645 oujiangping    8u     unix 0x0000000000000000      0t0    30083 type=STREAM
nm-applet 3645 oujiangping    9u  a_inode               0,11        0     9114 [eventfd]
nm-applet 3645 oujiangping   10u  a_inode               0,11        0     9114 [eventfd]
nm-applet 3645 oujiangping   11u  a_inode               0,11        0     9114 [eventfd]
nm-applet 3645 oujiangping   12u     unix 0x0000000000000000      0t0    30085 type=STREAM