这是关于 splice() 的另一个问题。我希望用它来复制文件,并尝试使用通过管道连接的两个 splice 调用,例如 splice 的 Wikipedia 页面上的示例。我写了一个简单的测试用例,它只尝试从一个文件中读取前 32K 字节并将它们写入另一个文件:
#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;
}
当我运行它时,输入文件似乎被正确读取,但第二个拼接调用因 EINVAL 而失败。有人知道我在这里做错了什么吗?
谢谢!