簡體   English   中英

使用Splice將文件復制到stdout

[英]Using Splice to Copy File to stdout

是否可以使用splice sys-call將文件復制到標准輸出? 這似乎是微不足道的,但是我遇到了困難。 我嘗試了以下代碼,但沒有成功:

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]);
}

具體來說,第二個拼接失敗,並帶有Invalid參數 我對這個示例有什么想法嗎?

當stdout引用不可搜索的流時,對splice()的調用將返回EINVAL。 我嘗試了您的程序,當stdout指向終端時,它失敗了。 但是,將stdout重定向到常規文件時,它會成功。

您在此調用中提供out偏移量:

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

...但是航站樓不是可找的。 &o_off更改為NULL

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM