zoukankan      html  css  js  c++  java
  • 高级I/O函数

    • pipe 函数

    int pipe( int fd[2] );

    创建管道,半双工,字节流,容量默认65536字节。fd[0]用来读,fd[1]用来写。

    可以用与父子进程间的无名管道,各自关闭一端。

    int sockpair(int domain, int type, int protocol, int fd[2]);

    创建双端管道,一端写另一端读,限制是只能使用本地协议族AF_UNIX。

    • dup 和 dup2函数

    int dup( int file_descriptor );

    int dup2( int file_descriptor_one, int file_descriptor_two );

    新的描述符和原先的描述符指向相同的文件、管道或者网络连接,失败返回-1,总小于 file_descriptor_two。

    返回的描述符总是系统当前最小的描述符。标准输入0, 标准输出1, 标准错误输出2。

    • readv 和 writev函数

    ssize_t readv( int fd, const struct iovec* vector, int count );

    ssize_t write( int fd, const struct iovec* vector, int count );

    分散读或者集中写,成功返回写/读的字节数,失败返回-1.

    • sendfile 函数

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

    文件描述符直接直接的数据传递,不经过缓冲区,称为零拷贝。

    限制:in_fd必须指向真实的文件,不能是socket和管道。

       out_fd必须是一个socket。

    成功返回发送到的字节数失败返回-1。

    • mmap 和 munmap

    void* mmap( void *start, size_t length, int port, int flags, int fd, off_t offset );

    int munmap( void* start, size_t length );

    进程间的共享内存,前者申请映射,后者释放。高效的IO没有额外的数据拷贝。

    • splice 函数

    ssize_t splice( int fd_it, loff_t* off_in, int fd_out, loff_t* off_out, size_t len, unsigned int flags );

    用于两个文件描述符之间移动数据,也是零拷贝。

    在fd_in如果是管道文件off_in设置为NULL。fd_in不是管道文件,off_in表示从偏移位置读取数据。

    fd_out同理。

    限制:fd_in和fd_out必须至少有一个是管道文件的描述符。

    • tee函数

    ssize_t tee( int fd_in, int fd_out, size_t len, unsigned int flags );

    实现了两个文件描述符上内容的拷贝。

    fd_in和fd_out必须同时是管道文件描述符。

    • fcntl函数

    int fcntl( int fd, int cmd, ... );

    提供了对描述符的控制(创建新描述符,获取信息,修改等);

  • 相关阅读:
    使用python scrapy爬取知乎提问信息
    [java基础]一文理解java多线程必备的sychronized关键字,从此不再混淆!
    python scrapy 登录知乎过程
    python scrapy爬虫框架概念介绍(个人理解总结为一张图)
    【干货】一文理解Druid原理架构(时序数据库,不是ali的数据库连接池)
    2016年我所面试过的那些公司
    写在2017年1月
    分页pagination实现及其应用
    inconsistent line count calculation in projection snapshot
    来去匆匆
  • 原文地址:https://www.cnblogs.com/zhangtiezi/p/8456835.html
Copyright © 2011-2022 走看看