sendfile() - Unix、Linux系统调用
Tutorials Point


  Unix入门
  Unix Shell编程
  高级Unix
  Unix有用参考
  Unix有用资源
  精选阅读

版权所有 © 2014 tutorialspoint



  首页     参考     讨论区     关于TP  

sendfile() - Unix、Linux系统调用


previous next AddThis Social Bookmark Button

广告

名称

sendfile - 在文件描述符之间传输数据

概要

#include <sys/sendfile.h>

ssize_t sendfile(int out_fd, int in_fd, off_t *
offset, size_t count);

描述

sendfile() 在一个文件描述符和另一个文件描述符之间复制数据。由于此复制操作在内核中完成,因此sendfile() 比read(2) 和write(2) 的组合效率更高,后者需要将数据传输到用户空间和从用户空间传输数据。

in_fd 应为打开以供读取的文件描述符,而out_fd 应为打开以供写入的描述符。

如果offset 不为 NULL,则它指向一个变量,该变量保存sendfile() 将从中读取数据的in_fd 的文件偏移量。当sendfile() 返回时,此变量将设置为读取的最后一个字节后的字节的偏移量。如果offset 不为 NULL,则sendfile() 不会修改in_fd 的当前文件偏移量;否则,当前文件偏移量将被调整以反映从in_fd 读取的字节数。

count是要在文件描述符之间复制的字节数。

目前(Linux 2.6.9):in_fd必须对应于支持mmap() 类操作的文件(即,它不能是套接字);并且out_fd必须引用套接字。

如果sendfile() 使用EINVAL或ENOSYS失败,应用程序可能希望回退到read(2)/write(2)。

备注

如果您计划使用sendfile() 将文件发送到TCP套接字,但需要在文件内容前面发送一些头数据,您会发现使用tcp(7) 中描述的TCP_CORK选项来最小化数据包数量并调整性能非常有用。

在Linux 2.4和更早版本中,out_fd可以引用常规文件,并且sendfile()会更改该文件的当前偏移量。

返回值

如果传输成功,则返回写入到out_fd 的字节数。发生错误时,返回 -1,并且errno 被适当地设置。

错误

标签描述
EAGAIN 已使用O_NONBLOCK选择非阻塞I/O,并且写入将阻塞。
EBADF 输入文件未打开以供读取,或者输出文件未打开以供写入。
EFAULT 错误地址。
EINVAL 描述符无效或已锁定,或者in_fd不可用mmap() 类操作。
EIO in_fd读取时出现未指定的错误。
ENOMEM 内存不足,无法从in_fd读取。

版本

sendfile() 是 Linux 2.2 中的新功能。包含文件 <sys/sendfile.h> 自 glibc2.1 起出现。

符合标准

POSIX.1-2001 或其他标准中未指定。

其他 Unix 系统使用不同的语义和原型实现sendfile()。不应在可移植程序中使用它。

参见



previous next Printer Friendly

广告


  

广告



广告