linux splice,从TCP套接字拼接时,Linux的splice(2)是否有效?

我一直在编写一个有趣的程序,可以在Linux上用C语言通过TCP传输文件.程序从套接字读取文件并将其写入文件(反之亦然).我最初使用读/写,程序工作正常,但后来我学到了splice并想试一试.

我用splice编写的代码在从stdin(重定向文件)读取并写入TCP套接字时非常有效,但在从套接字读取并写入stdout时,会立即将splice设置errno设置为EINVAL.手册页指出当两个描述符都不是管道(不是这种情况)时,EINVAL被设置,为无法搜索的流传递偏移量(没有传递偏移量),或文件系统不支持拼接,这导致我我的问题:这是否意味着TCP可以从管道拼接而不是?

我包括下面的代码(减去错误处理代码),希望我做错了.它主要基于Wikipedia example for splice.

static void splice_all(int from, int to, long long bytes)

{

long long bytes_remaining;

long result;

bytes_remaining = bytes;

while (bytes_remaining > 0) {

result = splice(

from, NULL,

to, NULL,

bytes_remaining,

SPLICE_F_MOVE | SPLICE_F_MORE

);

if (result == -1)

die("splice_all: splice");

bytes_remaining -= result;

}

}

static void transfer(int from, int to, long long bytes)

{

int result;

int pipes[2];

result = pipe(pipes);

if (result == -1)

die("transfer: pipe");

splice_all(from, pipes[1], bytes);

splice_all(pipes[0], to, bytes);

close(from);

close(pipes[1]);

close(pipes[0]);

close(to);

}

在旁注中,我认为当文件足够大时,由于管道填满(?),上面将阻塞第一个splice_all,所以我还有一个代码版本,可以从管道中读取和写入同时,但它与此版本具有相同的错误,并且更难以阅读.

编辑:我的内核版本是2.6.22.18-co-0.7.3(在XP上运行coLinux.)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值