gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:14:34 25 4
gpt4 key购买 nike

是否可以使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com