3

多くの大きなファイルをさらに大きな単一のファイルに連結する必要があるため、現在使用しています

cat file1 file2 ... output_file
でも、あの旧友よりも早くできるかどうか疑問に思っています。

のマニュアル ページを読むと、sendfile()*input_file* へのオフセットを指定でき、そこから残りの部分を *output_file* に送信できます。しかし: *output_file* にオフセットを指定することはできますか? または、出力 FD を開いたままにし、それに sendfile() を繰り返し挿入して、*input_files* を効果的に連結するだけで、すべての入力ファイルを単純にループすることはできますか? 言い換えれば、出力 FD を閉じたり、seek() しないと、出力 FD へのファイルポインタは最後に残りますか?

catを使用したそのような実装を知っている人はいますsendfile()か?


確かに、私はプログラマーではなく管理者なので、「本当の」コーディング知識がないことをご容赦ください...

4

1 に答える 1

3

はい、出力 fd のファイル ポインターは最後に残ります (ファイルが新しい場合、または既に書き込んだデータよりも大きくない場合)。

sendfile()のドキュメントには、明示的に言及されています(強調は私のものです):

2.6.33 より前の Linux カーネルでout_fdは、ソケットを参照する必要があります。Linux 2.6.33 以降では、任意のファイルを指定できます。通常のファイルの場合は sendfile()、ファイル オフセットを適切に変更します

個人的にはcatに依存する の実装を見たことがありません。sendfile()おそらく 2.6.33 はごく最近のものであり、それ以前には存在しout_fdなかったからでしょうfileno(stdout)sendfile()も移植性がないため、これを行うと、catLinux 2.6.33 以降でのみ実行される のバージョンになります (ただし、コンパイル時にアクティブ化されるプラットフォーム依存の最適化として実装できると思います)。

于 2013-04-02T17:24:13.333 に答える