web-dev-qa-db-ja.com

execはファイル記述子を保持しますか

これは実際には2段階の質問です。

  1. ファイル記述子とは正確には何ですか?開いているファイルを表現する最も基本的な方法だと思いました。しかし、dup2は2つの異なるファイル記述子が同じファイルを指すようにすることができるので、一意のファイルを表すのは何ですか?

  2. Execの前にdup2を実行すると、プログラム全体が消去されますが、同じファイル記述子テーブルが残っていますか?リダイレクトされたファイル記述子は引き続きリダイレクトされますか?

17
Xufeng

はい。開いているファイル記述子は、execの呼び出し全体で保持されます。 execve manページ から(すべての_exec*_呼び出しはこのシステムコールのラッパーにすぎません):

デフォルトでは、ファイル記述子はexecve()全体で開いたままになります。 close-on-execとマークされたファイル記述子は閉じられます。 fcntl(2)の_FD_CLOEXEC_の説明を参照してください。

  1. はい、 ファイル記述子 は、システムコールを行うときにユーザースペースがファイルを開くを参照する方法です。 (またはソケット、またはパイプなど)それらを複製できるという事実はそれを変更しません。それらは、同じ開いているファイルへの複数の参照にすぎません。参照:

  2. はい、マニュアルページの引用に記載されているように。

実際、多くのプログラム(シェルを含む)はこの機能に依存しています。そうでない場合、プログラムは標準の入力/出力/エラーファイル記述子を開かずに起動します。シェルがプログラムを実行すると、forks、_dup2_が0,1,2へのオープンttyファイル記述子になり、次にexecveが新しいプログラムになります。

19