2017-12-24 16 views
0

私はmanページの一握りを読んだ:現在、私はMMAPを使用していますなど、ファイルディスクリプタを簡単にフォークする方法はありますか?

をDUP、dup2の、fcntlの、PREAD/PWRITE、mmapのを、私はする必要があるので、それは世界で最も素晴らしいものではありませんファイルのオフセットとバッファの長さを自分で管理し、基本的にユーザ空間での読み書きを再実装します。私が集めたものから

:そのオフセットとフラグが共有されるように

  1. DUPは、dup2のは、fcntlのはただ、FDSのエイリアスを作成する - 1からの読み込みは、他のオフセットを進めます。
  2. pread/pwriteがバグの可能性があり、結果が一貫しない可能性があります。
  3. いくつか珍しいフラグが与えられた場合、mmapはLinux上でバグですが、私はそれらを必要としません。

私は何かが見当たりませんか、実際に行く方法はありますか?

(ファイルとはPOSIXでは危険であることに注意してください - Windowsとは異なり、POSIXは、ファイルが開いている間は移動/削除されないパスを保証しません。ファイルを削除することもできますが、ファイルを削除することもできますし、iノードを開くこともできませんでした)

少なくとも、最も一般的なPOSIXの変形彼らのために誰も答えません。

+0

あなたが求めているものを実際に明確ではありません。プロセスはフォークされ、ファイル記述子はフォークされません。ディスクリプタを複製する場合は、 'dup2'または' dup3'を使います。子がファイル記述子のコピーを持つように、フォークする前に 'childFileHandle = fcntl(...、F_DUPFD、...)'を呼び出すこともできます。コピーとフォークの後、親は子のファイル記述子を閉じる。しかし、私はそれが 'dup2'がすでにしていることだと思います。 – jww

+0

'newfd = some_operation(oldfd);アサート(oldfd!= newfd); read_some_bytes(oldfd);アサート(ftell(oldfd)!= ftell(newfd)); 'は私が望むものです。 "fork"はプロセスに限定されず、git forks、blockchain forksなどです。基本的な考え方は "fork"が別々の方法になり、私はforkしたfdを別々の方法で動かすことです。 – SoniEx2

+0

いいえ、別々のオフセット<==>異なるopen()s。 –

答えて

2

Linuxの場合、最初に開いたときと同じ名前のファイルであるかどうかにかかわらず、/proc/self/fd/$NUMを開いても新しいオープンファイルの説明(つまり、独立したオフセットとフラグを持つ新しいfd)が生成されます。

これを行うためのPOSIXの移植可能な方法はわかりません。

(私もあなたがPREAD/PWRITEはバギーであることについて何を意味するのか分からない...)

関連する問題