ben*_*ace 5 c linux system-calls 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 );
}
}
}
Run Code Online (Sandbox Code Playgroud)
第一次迭代中对splice的第二次调用每次返回EINVAL(来自perror的无效参数) - 可能是什么原因?
Mar*_*rkR -1
我不知道这是否是最好的方法,但这对我有用:
http://vectrex.org.uk/mark/splicecopy.cpp
它创建一个用于读取的线程和另一个用于写入的线程。这可能是不必要的。写入线程似乎只需要一次 splice() 调用,但读者在我的系统上大约每 64k 调用一次。
以上在 Fedora 13 x86_64 上进行了测试,似乎能够复制大型文件。