CとC ++の文脈では、システムclose()
コールopen()
はカーネルがfdをリサイクルし、後で同じプロセスライフサイクルで呼び出すときにそれを再利用する唯一の方法ですか?マルチスレッドプログラムはどうですか?
答え1
注意深く読んでください閉じる(2)そして高度なLinuxプログラミング
あなたの声明が間違っています。閉じるは次のとおりです。システムコール(に記載システムコール(2)Linuxでは、アプリケーションはカーネルにリソースを解放するように指示します(その逆ではありません)。使用できるトラック(1)特定のコマンドまたはプロセスによって実行されるシステムコールについて学びます。また、見ることができます並列スレッド(7)、バウチャー(7)、フォーク(2)、実行(2)、クローン(2)
はい、ファイル記述子(そしてアドレス空間存在する仮想メモリ、望むよりマッピング(2))は与えられたすべてのスレッドに共通です。プロセス。しかし、低レベルを使用して直接「スレッド」を生成する場合は(まれに)あります。クローン(2)システムコール(実際には実装者このようなスレッドライブラリ並列スレッド)、もしかしたらいいえ使用されるものがCLONE_FILES
異なります。しかし、直接電話するclone
のは闇の芸術です。
pidが1234の特定のプロセスに対して、Linuxは一連のファイル記述子を照会できます(工程(5))via/proc/1234/fd/
とviaマッピングされたメモリ/proc/1234/maps
(blah blah blah ...有用なものがたくさんあります。偽)のファイルとリンク/proc/1234
。プロセス内で/proc/self/fd/
パラメータとして使用できます。ディレクトリを開く(3)
もちろん、ファイル記述子は単純なファイル記述子ではありません。POSIXまたはLinuxよりも標準的なものC99またはC++11一つ。例えば、ファイル番号(3)&開いているC99ではなくPOSIXで定義されています。
したがって、特定の数字(たとえば49)がopen
複数回返されると、プログラムの別の部分(おそらくいくつかのライブラリ、別のスレッド)がclose
49を呼び出すためです。カーネルは尋ねず、ファイル記述子を「魔法のように」閉じません(プロセスが終了する場合を除く)。デバッガを使用するstrace
か、gdb
デバッガにブレークポイント(条件付きブレークポイント)を設定できます。close
答え2
これに加えて、close
ファイル記述子を閉じて再利用できるシステムコールがいくつかあります。dup2
Linuxではdup3
。
これに関するトレースログを確認することもできます。