Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Splice将文件复制到标准输出_C_Linux_Linux Kernel - Fatal编程技术网

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

使用Splice将文件复制到标准输出,c,linux,linux-kernel,C,Linux,Linux Kernel,是否可以使用splicesys调用将文件复制到标准输出?这似乎是微不足道的,但我有困难。我尝试了以下代码,但没有成功: void example(char *filename) { int buf_size = 2048; FILE* f = fopen(filename, "r"); if (f == NULL){ perror(filename); exit(1); } int fd = fileno(f);

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

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]);
}
void示例(char*filename){
int buf_size=2048;
文件*f=fopen(文件名,“r”);
如果(f==NULL){
perror(文件名);
出口(1);
}
int fd=文件号(f);
int filedes[2];
if(管道(filedes)<0){
佩罗(“管道”);
出口(1);
}
结构统计;
如果(fstat(fd和st)<0){
佩罗尔(“fstat”);
出口(1);
}
关闭至打印=标准尺寸;
loff_t i_off=0;
loff_t o_off=0;
而(要打印>0){
如果(buf_大小>待打印)buf_大小=待打印;
ssize_t r=拼接(fd,&i_off,filedes[1],NULL,buf_大小,拼接更多,拼接移动);
if(r<0){
perror(“拼接”);
出口(1);
}
r=拼接(filedes[0],NULL,标准输出文件号,&o_关闭,buf_大小,拼接更多,拼接移动);
if(r<0){
perror(“第2条”);
出口(1);
}
要打印-=基本尺寸;
}
关闭(fd);
关闭(filedes[0]);
关闭(filedes[1]);
}

具体来说,第二个拼接失败,参数无效。知道我在这个示例中哪里出错了吗?

当stdout引用不可查找的流时,调用
splice()
返回EINVAL。我试过你的程序,但当stdout指向终端时失败了。但是,当标准输出被重定向到常规文件时,它会成功。

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

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

。。。但是终点站是看不见的。将
&o_off
更改为
NULL

示例不可编译-您的
\include
语句在哪里?您是正确的,这是我的一个明显错误。非常感谢。