9

Descriptor tableUnix カーネルは、 、File table、およびの3 つのデータ構造を使用して開いているファイルを表しますv-node table
プロセスがファイルを 2 回開くと、 で 2 つの異なる記述子、descriptor tableで 2 つのエントリを取得しfile table(同じファイルで異なる位置にあるように)、両方とも で 1 つのエントリを指しv-node tableます。
また、子プロセスは親プロセスの を継承するdescriptor tableため、カーネルはdescriptor tableプロセスごとに 1 つを保持します。しかし、異なるプロセスからの 2 つの記述子が の同じエントリを指していopen file tableます。
そう

  1. 子プロセスがファイルを読み取ると、同じファイルのオフセットが親プロセスで変更されますか?
  2. fork1 が true の場合、2 つのプロセスに対して、同じファイルに対して同じ効果を得る便利な方法はありますか? つまり、2 つのプロセスが同じファイルの位置 (オフセット) 情報を共有します。
  3. 同じファイルを開いた2つの無関係なプロセスのように、両方のプロセスがまったく無関係なテーブルを持つようにフォークする方法はありますか?
4

1 に答える 1

11

子プロセスがファイルを読み取る場合、同じファイルのオフセットは親プロセスで変更されますか?

はい、オフセットはシステム全体のファイルテーブルに保存されているためです。dupまたはを使用して同様の効果を得ることができますdup2

fork1が真の場合、2つのプロセスについて、同じファイルに対して同じ効果を得ることができる便利な方法はありますか?つまり、2つのプロセスが同じファイル上の位置(オフセット)情報を共有します。

Unixドメインソケットを使用した「ファイル記述子の受け渡し」と呼ばれる手法があります。で「補助」データを探しsendmsgます。

同じファイルを開いただけの2つの無関係なプロセスのように、両方のプロセスが完全に無関係なテーブルを持つようにフォークする方法はありますか?

openこれを達成するには、ファイルを再度作成する必要があります。それはあなたが望むことをしませんが、あなたはFD_CLOEXEC旗も探すべきです。

于 2012-07-04T08:14:13.030 に答える