• linux高性能服务器编程第六章高级IO函数 (2)


    读写数据 - readv writev mmap munmap

    readv/writev

    #include <sys/uio.h>
    // count 为 vector的长度, 即为有多少块内存
    // 成功时返回写入\读取的长度 失败返回-1
    ssize_t readv(int fd, const struct iovec* vector, int count);
    ssize_t writev(int fd, const struct iovec* vector, int count);
    
    struct iovec {
        void* iov_base /* 内存起始地址*/
        size_t iov_len /* 这块内存长度*/
    }

    回来补上一个使用例子, 这个例子将一个int的内存表示写入到了文件之中 使用hexdump查看这个文件0000000 86a0 0001可以看到186a0即为100000

    // 2020年1月7日16:52:11
    int main()
    {
        int file = open("/home/lsmg/1.txt", O_WRONLY);
        int temp = 100000;
        iovec temp_iovec{};
        temp_iovec.iov_base = &temp;
        temp_iovec.iov_len = sizeof(temp);
        writev(file, &temp_iovec, 1);
    }

    sendfile函数

    #include <sys/sendfile.h>
    // offset为指定输入流从哪里开始读, 如果为NULL 则从开头读取
    ssize_t sendfile(int out_fd, int in_fd, off_t* offset, size_t count);
    
    O_RDONLY只读模式
    O_WRONLY只写模式
    O_RDWR读写模式
    int open(file_name, flag);

    stat结构体, 可用fstat生成, 简直就是文件的身份证

    #include <sys/stat.h>
    struct stat
    {
        dev_t       st_dev;     /* ID of device containing file -文件所在设备的ID*/
        ino_t       st_ino;     /* inode number -inode节点号*/
        mode_t      st_mode;    /* protection -保护模式?*/
        nlink_t     st_nlink;   /* number of hard links -链向此文件的连接数(硬连接)*/
        uid_t       st_uid;     /* user ID of owner -user id*/
        gid_t       st_gid;     /* group ID of owner - group id*/
        dev_t       st_rdev;    /* device ID (if special file) -设备号,针对设备文件*/
        off_t       st_size;    /* total size, in bytes -文件大小,字节为单位*/
        blksize_t   st_blksize; /* blocksize for filesystem I/O -系统块的大小*/
        blkcnt_t    st_blocks;  /* number of blocks allocated -文件所占块数*/
        time_t      st_atime;   /* time of last access -最近存取时间*/
        time_t      st_mtime;   /* time of last modification -最近修改时间*/
        time_t      st_ctime;   /* time of last status change - */
    };

    身份证生成函数

    // 第一个参数需要调用open生成文件描述符
    // 下面其他两个为文件全路径
    int fstat(int filedes, struct stat *buf);
    
    // 当路径指向为符号链接的时候, lstat为符号链接的信息. stat为符号链接指向文件信息
    int stat(const char *path, struct stat *buf);
    int lstat(const char *path, struct stat *buf);
    
    /*
    * ln -s source dist  建立软连接, 类似快捷方式, 也叫符号链接
    * ln source dist  建立硬链接, 同一个文件使用多个不同的别名, 指向同一个文件数据块, 只要硬链接不被完全
    * 删除就可以正常访问
    * 文件数据块 - 文件的真正数据是一个文件数据块, 打开的`文件`指向这个数据块, 就是说
    * `文件`本身就类似快捷方式, 指向文件存在的区域.
    */

    mmap和munmap函数

    mmap创建一块进程通讯共享的内存(可以将文件映射入其中), munmap释放这块内存

    #include <sys/mman.h>
    
    // start 内存起始位置, 如果为NULL则系统分配一个地址 length为长度
    // port参数 PROT_READ(可读) PROT_WRITE(可写) PROT_EXEC(可执行), PROT_NONE(不可访问)
    // flag参数 内存被修改后的行为
    // - MAP_SHARED 进程间共享内存, 对内存的修改反映到映射文件中
    // - MAP_PRIVATE 为调用进程私有, 对该内存段的修改不会反映到文件中
    // - MAP_ANONUMOUS 不是从文件映射而来, 内容被初始化为0, 最后两个参数被忽略
    // 成功返回区域指针, 失败返回 -1
    void* mmap(void* start, size_t length, int port, int flags, int fd, off_t offset);
    // 成功返回0 失败返回-1
    int munmap(void* start, size_t length);
  • 相关阅读:
    oracle 如何用触发器实现更新刚插入的数据
    数据库好论坛
    不同的用户导入数据库
    用函数式编程技术编写优美的 JavaScript
    使用GridView自带的ToolTip隐藏过长的数据
    含有dropdownlist的gridview增删改查
    数据分析
    数据分析
    xshell链接vbox 上 nat 方式链接虚拟机
    测试开发方法概述
  • 原文地址:https://www.cnblogs.com/mjhjl/p/16229124.html
Copyright © 2020-2023  润新知