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);