高级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可以运行很多其它的控制。

Linux高性能server编程——高级I/O函数的更多相关文章

  1. Linux 高性能server编程——高级I/O函数

    重定向dup和dup2函数 #include <unistd.h> int dup(int file_descriptor); int dup2(int file_descriptor_o ...

  2. Linux 高性能服务器编程——高级I/O函数

    重定向dup和dup2函数 #include <unistd.h> int dup(int file_descriptor); int dup2(int file_descriptor_o ...

  3. Linux高性能server编程——Linux网络基础API及应用

     Linux网络编程基础API 具体介绍了socket地址意义极其API,在介绍数据读写API部分引入一个有关带外数据发送和接收的程序,最后还介绍了其它一些辅助API. socket地址API 主 ...

  4. Linux高性能server编程——信号及应用

     信号 信号是由用户.系统或者进程发送给目标进程的信息.以通知目标进程某个状态的改变或系统异常. Linux信号可由例如以下条件产生: 对于前台进程.用户能够通过输入特殊的终端字符来给它发送信号. ...

  5. Linux高性能server编程——定时器

    版权声明:本文为博主原创文章.未经博主允许不得转载. https://blog.csdn.net/walkerkalr/article/details/36869913  定时器 服务器程序通常管 ...

  6. Linux高性能server编程——多线程编程(下)

    多线程编程 条件变量 假设说相互排斥锁是用于同步线程对共享数据的訪问的话.那么条件变量则是用于线程之间同步共享数据的值. 条件变量提供了一种线程间的通信机制:当某个共享数据达到某个值得时候,唤醒等待这 ...

  7. Linux高性能server编程——I/O复用

     IO复用 I/O复用使得程序能同一时候监听多个文件描写叙述符.通常网络程序在下列情况下须要使用I/O复用技术: client程序要同一时候处理多个socket client程序要同一时候处理用户 ...

  8. Linux高性能server编程——系统检測工具

    系统检測工具 tcpdump tcpdump是一款经典的抓包工具,tcpdump给使用者提供了大量的选项,泳衣过滤数据报或者定制输出格式. lsof lsof是一个列出当前系统打开的文件描写叙述符的工 ...

  9. linux高性能服务器编程

    <Linux高性能服务器编程>:当当网.亚马逊 目录: 第一章:tcp/ip协议族 第二章:ip协议族 第三章:tcp协议详解 第四章:tcp/ip通信案例:访问Internet 第五章: ...

随机推荐

  1. Maven 版 JPA 最佳实践(转)

    项目结构图 数据库环境 数据库:MySQL 版本:5.x 数据库名:jpa-demo 用户名密码:root/1234 代码清单 1:数据库脚本: ? 1 2 3 4 5 6 7 8 9 10 11 1 ...

  2. CodeIgniter中的session处理

    在CI中你可以这样很简单地装载library:     $this->load->library('newclass');    注意系统中会有两个library目录,一个是system/ ...

  3. 最佳实践:Windows Azure 网站 (WAWS)

     编辑人员注释:本文章由 Windows Azure 网站团队的项目经理Sunitha Muthukrishna 撰写. Windows Azure 网站 (WAWS) 允许您在 Windows ...

  4. poj 3128 Leonardo&#39;s Notebook(置换的幂)

    http://poj.org/problem?id=3128 大致题意:输入一串含26个大写字母的字符串,能够把它看做一个置换.推断这个置换是否是某个置换的平方. 思路:具体解释可參考url=ihxG ...

  5. virtual 关键字

    virtual 关键字用于修饰方法.属性.索引器或事件声明,并且允许在派生类中重写这些对象.例如,此方法可被任何继承它的类重写. public virtual double Area() { retu ...

  6. Spring data redis的一个bug

    起因 前两天上线了一个新功能,导致线上业务的缓存总是无法更新,报错也是非常奇怪,redis.clients.jedis.exceptions.JedisConnectionException: Unk ...

  7. React Native-目前最火的前端技术?

    做为一名产品经理,你是否遇到过这样的窘境,“帮我把字体调成 16号呗,颜色变成 #FFFF00FF,老大说这里最好改一下”,作为一名 app 的开发只能无奈但心里窃喜的告诉你,“只能等下个版本了,必须 ...

  8. java结构与算法之选择排序

    一 .java结构与算法之选择排序(冒择路兮快归堆) 什么事选择排序:从一组无序数据中选择出中小的的值,将该值与无序区的最左边的的值进行交换. 简单的解释:假设有这样一组数据 12,4,23,5,找到 ...

  9. 【转载】CentsOS系统inotify实时监控服务器文件(夹)定制事件处理程序

    原始博文和参考博文 1.CentsOS系统inotify实时监控服务器文件 2.Linux中让进程在后台运行的方法 3.linux inotify 监控文件系统事件 非常好 方法一 说明: 服务器系统 ...

  10. zookeeper 安装

    Zookeeper安装 一.   下载zookeeper http://www.apache.org/dist/zookeeper/stable/ 二.   解压zookeeper.tar >& ...