调用linux splice时无效的参数()
问题描述:
我想尝试splice系统调用。我有这样的功能 - 它应该将一个文件的内容复制到另一个:调用linux splice时无效的参数()
static void test_splice(int in, int out) {
int i = 0, rcvd = 0;
int filedes[2];
off_t off = 0;
if (pipe(filedes) < 0) {
perror("Kicha pipe");
exit(EXIT_FAILURE);
}
for (i = 0; i < NUMLOOPS; ++i) {
if ((rcvd = splice(in, NULL, filedes[1], NULL, BUFSIZE, SPLICE_F_MORE | SPLICE_F_MOVE)) < 0) {
perror("splice");
exit(EXIT_FAILURE);
}
if (splice(filedes[0], NULL, out, NULL, rcvd, SPLICE_F_MORE | SPLICE_F_MOVE) < 0) {
perror("splice");
exit(EXIT_FAILURE);
}
}
}
第二个电话在第一次迭代拼接(从PERROR无效参数)将返回EINVAL每次 - 可能是什么原因?
答
我不知道这是否是这样做的最佳方式,但是这对我的作品:
http://vectrex.org.uk/mark/splicecopy.cpp
它创建一个线程读取,而另一个用于写作。这可能是不必要的。写入线程似乎只需要一个splice()调用,但读者在我的系统上大约每64k就会执行一次。
以上是在Fedora 13 x86_64上测试的,似乎可以复制larg(ish)文件。
答
ERRORS
...
EINVAL Target filesystem doesn't support splicing; target file is
opened in append mode; neither of the file descriptors refers to
a pipe; or offset given for nonseekable device.
...
OP的评论指出,他开设了追加模式的文件。
你的文件是什么类型的文件系统? – Duck 2010-04-05 19:03:22
这两个ext3,但我也尝试从/ dev/zero读取,并写入/ dev/null与相同的错误。 – 2010-04-05 19:08:07
我刚刚解决了它 - 我打开文件使用fopen模式“a +” - 当更改为“w” - 它的工作。 – 2010-04-05 19:17:19