大申
利剑无意,软剑无常,重剑无锋,木剑无滞,无剑无式。
posts - 4,comments - 0,trackbacks - 0
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相同。





posted on 2014-08-29 14:28 大申 阅读(209) 评论(0)  编辑 收藏 引用 所属分类: Linux

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理