Linux高性能服务器编程——高级I/O函数
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Linux高性能服务器编程——高级I/O函数,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2525字,纯文字阅读大概需要4分钟。
内容图文
高级 I/O 函数
pipe 函数
pipe 函数用于创建一个管道,实现进程间的通信。
#include <unistd.h>
int pipe(int pipefd[2]);
通过 pipe 函数创建的文件描述符 fd[0] 和 fd[1] 分别构成管道的两端,往 fd[1] 写入的数据可以从 fd[0] 读出,不能反过来。管道内部传输的数据时字节流,和 TCP 字节流概念相同,但有区别,管道本身拥有一个容量限制,它规定如果应用程序不将数据从管道读走的话,该管道最多能被写入多少字节的数据。管道容量阿东小默认是 65536 字节,可以用 fcntl 函数来修改管道容量。
此外, socket 基础 API 中有一个 socketpair 函数,能够方便创建双向管道。
#include<sys/types.h> /* See NOTES*/
#include<sys/socket.h>
intsocketpair(int domain, int type, int protocol, int sv[2]);
这里 domain 只能使用 UNIX 本地域协议族 AF_UNIX ,因为我们仅能在本地使用这个双向管道。
dup 函数和 dup2 函数
#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);
dup 函数创建一个新的文件描述符,该新的文件描述符和原有的文件描述符 file_descriptor 指向相同的文件、管道或网络连接。并且 dup 返回的文件描述符总是取系统当前可用的最小整数值。 Dup2 和 dup 类型,不过它将返回第一个不小于 newfd 的整数值。 dup 和 dup2 系统调用失败时返回 -1 并设置 errno 。
通过 dup 和 dup2 创建的文件描述符并不继承原文件描述符的属性。
readv 函数和 writev 函数
readv 函数将数据从文件描述符督导分散的内存块中,即分散读。 Writev 函数则将多块分散的内存数据一并写入文件描述符中,即集中写。定义如下:
#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);
fd 是文件描述符, iov 是 iovec 结构数组,该结构体描述一块内存区, iovcnt 参数是数组的长度。
sendfile 函数
sendfile 函数在两个文件描述符之间直接传递数据(完全在内核中操作),从而避免了内核缓冲区和用户缓冲区之间的数据拷贝,效率高,这被称为零拷贝。
#include <sys/sendfile.h>
ssize_t sendfile(int out_fd, int in_fd,off_t *offset, size_t count);
in_fd 参数是带读出内容的文件描述符, out_fd 参数是带写入内容的文件描述符, offset 参数指定从读入文件流的哪个位置开始读, count 指定文件描述符 in_fd 和 out_fd 之间传输的字节数。
mmap 函数和 munmap 函数
mmap 函数用于申请一段内存空间。我们可以将这段内存作为进程通信的共享内存,也可以将文件直接映射到其中。 Munmap 函数则释放由 mmap 创建的这段内存空间。定义如下:
#include <sys/mman.h>
void *mmap(void *addr, size_t length, intprot, int flags, int fd, off_t offset);
int munmap(void *addr, size_t length);
其中, start 参数允许用于使用某个特定的地址作为这段内存的起始地址。如果被设置成 NULL ,则系统自动分配一个地址。 Length 参数指定内存段的长度。 Port 参数用来设置内存段的访问权限, flag 参数控制内存段被修改后程序的行为。 Fd 参数是被映射文件对应的文件描述符。 Mmap 函数成功时返回指向目标内存区域的指针,失败则返回 MAP_FAILED ,并设置 errno 。
splice 函数
#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);
用来控制两个文件描述符之间的数据移动,也是零拷贝操作。 Flag 参数控制数据流如何移动。
tee 函数
tee 函数在两个管道文件描述符之间复制数据,也是零拷贝操作。它不消耗数据,因此源文件描述符上的数据仍然可以用于后续的读操作。 Tee 函数的原型如下:
#define _GNU_SOURCE /* See feature_test_macros(7) */
#include <fcntl.h>
ssize_t tee(int fd_in, int fd_out, size_tlen, unsigned int flags);
fcntl 函数
fcntl 函数提供了对文件描述符的各种控制操作。另外一个常见的控制文件描述符属性和行为的系统调用时 ioctl ,而且 ioctl 比 fcntl 能够执行更多的控制。
原文:http://blog.csdn.net/walkerkalr/article/details/36023769
内容总结
以上是互联网集市为您收集整理的Linux高性能服务器编程——高级I/O函数全部内容,希望文章能够帮你解决Linux高性能服务器编程——高级I/O函数所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。