高级IO函数

高级IO函数
1、匿名管道:
   #include <unistd.h>
   int pipe(int fd[2]);
   如果管道的写文件描述符 fd[1]的引用计数为0,则针对该管道的读文件描述符fd[0]的read操作返回0,即读取到了文件结束标记EOF;如果管道的读文件描述符fd[0]的应用计数为0,则针对该管道的写文件描述符fd[1]的write操作将失败,并引发SIGPIPE信号。
   自Linux 2.6.11内核起管道容量大小默认是65536字节。
2、创建双向管道:
   #include <sys/types.h>
   #include <sys/socket.h>
   int socketpair(int domain,int type,int protocol,int fd[2]);
   前三个参数含义与socket系统调用相同,但domain只能用UNIX本地域协议族AF_UNIX或AF_LOCAL(因为仅能在本地使用双向管道)。
3、标准输入/输出重定向:
   #include <unistd.h>
   int dup(int oldfd);
   int dup2(int oldfd,int newfd);
   创建一个新的文件描述符,与原有文件描述符指向相同的文件、管道或网络连接,dup返回的文件描述符总是取系统当前可用的最小整数值,而dup2将返回第一个不小于newfd的整数值。不过通过dup系列创建的文件描述符不继承原文件描述符的属性。
4、分散读/集中写:
   #include <sys/uio.h>
   ssize_t readv(int fd,const struct iovec *iov,int iovcnt);
   ssize_t writev(int fd,const struct iovec *iov,int iovcnt);
   相当于简化版的recvmsg/sendmsg函数。
5、零拷贝:
   #include <sys/sendfile.h>
   ssize_t sendfile(int out_fd,int in_fd,off_t *offset,size_t count);
   用于在两个文件描述符之间传递数据,返回值表示传输的字节数。in_fd是待读文件描述符,必须指向真实的文件,不能使socket或管道;out_fd是待写文件描述符,必须是一个socket;offset表示读取文件流的开始位置,若为NULL则使用默认的起始位置。
   #define _GNU_SOURCE
   #include <fcntl.h>
   ssize_t splice(int fd_in,loff_t *off_in,int fd_out,loff_t *off_out,size_t len,unsigned int flags);
   用于在两个文件描述符之间移动数据,返回值表示移动的字节数。fd_in/fd_out必须至少有一个是管道文件描述符,当为管道文件描述符时对应的off_in/off_out必须是NULL,flags参数控制数据如何移动。
   #define _GNU_SOURCE
   #include <fcntl.h>
   ssize_t tee(int fd_in,int fd_out,size_t len,unsigned int flags);
   用于在两个管道文件描述符之间复制数据。函数参数含义与splice相同。





你可能感兴趣的:(高级IO函数)