c - 调用 linux splice() 时参数无效

标签 c linux system-calls splice

我想尝试 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 );
                }
        }
}

在第一次迭代中对 splice 的第二次调用每次都会返回 EINVAL(来自 perror 的无效参数)——可能是什么原因?

最佳答案

来自 splice(2) :

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 的评论表明他以追加模式打开文件。

关于c - 调用 linux splice() 时参数无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2580390/

相关文章:

linux - 为什么 php 进程在那里挂了将近 3 个月?

system-calls - 了解标准库函数是否正在执行系统调用的重要性

linux - 寻找 linux 应用程序或命令以使用 grep 和 sed 将图像通过管道传输

c - statvfs 系统调用失败,错误值对于定义的数据类型来说太大

c - 使用 atoi() 对整数进行输入验证

c - 如何让 Eclipse 识别 __far 修饰符?

linux - 交叉编译的 ARM 内核而不是 ARMHF

linux - 在 shell 脚本中使用函数时如何记录压缩的 zip 文件

c - 彼得森算法的错误

python - Python 3 解释器在嵌入时会泄漏内存吗?