c - 使用 Splice 将文件复制到标准输出

标签 c linux linux-kernel

是否可以使用 splice 系统调用将文件复制到标准输出?这似乎是微不足道的,但我遇到了困难。我尝试了以下代码但没有成功:

void example(char *filename) {
    int buf_size = 2048;

    FILE* f = fopen(filename, "r");

    if (f == NULL){
        perror(filename);
        exit(1);
    }
    int fd = fileno(f);

    int filedes[2];
    if(pipe(filedes) < 0){
        perror("pipe");
        exit(1);
    }

    struct stat st;

    if (fstat(fd, &st) < 0){
        perror("fstat");
        exit(1);
    }

    off_t to_print = st.st_size;
    loff_t i_off = 0;
    loff_t o_off = 0;

    while(to_print > 0){
        if(buf_size > to_print) buf_size = to_print;

        ssize_t r = splice(fd,&i_off,filedes[1],NULL,buf_size, SPLICE_F_MORE | SPLICE_F_MOVE);

        if (r < 0){
            perror("splice");
            exit(1);
        }
        r = splice(filedes[0],NULL,STDOUT_FILENO,&o_off,buf_size, SPLICE_F_MORE | SPLICE_F_MOVE);

        if (r < 0){
            perror("splice2");
            exit(1);
        }

        to_print -= buf_size;
    }

    close(fd);
    close(filedes[0]);
    close(filedes[1]);
}

具体来说,第二个拼接因参数无效而失败。我对这个例子有什么误解吗?

最佳答案

您在此调用中提供一个输出偏移量:

        r = splice(filedes[0],NULL,STDOUT_FILENO,&o_off,buf_size, SPLICE_F_MORE | SPLICE_F_MOVE);

...但是终端不可搜索。将 &o_off 更改为 NULL

关于c - 使用 Splice 将文件复制到标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32218381/

相关文章:

c - 我怎样才能改变这些变量?

c - 有没有办法在 PIC 电路上运行我的 GTK 程序 (C)?

c - 为什么这不执行第二个 printf?

linux - 查找 之间的区别 . -name '*.xyz'(点空格连字符)并查找 . .name '*.xyz'(点空间点)

c - ptrace 在 Linux 中如何工作?

java - NFS 客户端锁定当前正在远程 NFS 服务器中写入的文件

c - typedef 枚举,在其中赋值

c - 有人曾经将 I2C 拆分到两个微 Controller 上吗?

android - 为 android x86 编译 CUPS

linux-kernel - 用户空间进程上的Linux内核模块信号被杀死