splice()に関するもう1つの質問です。私はファイルをコピーするためにそれを使用することを望んでおり、spliceのWikipediaページの例のようなパイプで結合された2つのスプライス呼び出しを使用しようとしています。私はこれを実行すると、入力ファイルを正しく読み取ることのようですLinuxのsplice()関数を使用してファイルを別のファイルにコピーするにはどうすればよいですか?
#define _GNU_SOURCE
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
int main(int argc, char **argv) {
int pipefd[2];
int result;
FILE *in_file;
FILE *out_file;
result = pipe(pipefd);
in_file = fopen(argv[1], "rb");
out_file = fopen(argv[2], "wb");
result = splice(fileno(in_file), 0, pipefd[1], NULL, 32768, SPLICE_F_MORE | SPLICE_F_MOVE);
printf("%d\n", result);
result = splice(pipefd[0], NULL, fileno(out_file), 0, 32768, SPLICE_F_MORE | SPLICE_F_MOVE);
printf("%d\n", result);
if (result == -1)
printf("%d - %s\n", errno, strerror(errno));
close(pipefd[0]);
close(pipefd[1]);
fclose(in_file);
fclose(out_file);
return 0;
}
が、2番目のスプライスコール:私は別のものにそれらを一つのファイルから最初の32Kバイトを読み書きしようとすると、簡単なテストケースを書きましたEINVALで失敗します。誰も私がここで間違っていることを知っていますか?
ありがとうございます! splice manpageから
これを読んだ人には、2番目の 'splice'呼び出しは、返された最初の' splice'呼び出しのように、パイプからのバイト数を読み取ろうとするべきです。今日のLinuxでは、デフォルトのパイプサイズは「65535」です。 – Jite