宿州网站建设哪家公司好,led网站源码,昆明专业网站建设模板,移动应用开发适合女生吗存储映射区介绍 存储映射I/O (Memory-mapped I/O) 使一个磁盘文件与存储空间中的一个缓冲区相映射。从缓冲区中取数据#xff0c;就相当于读文件中的相应字节#xff1b;将数据写入缓冲区#xff0c;则会将数据写入文件。这样#xff0c;就可在不使用read和write函数的情况…存储映射区介绍 存储映射I/O (Memory-mapped I/O) 使一个磁盘文件与存储空间中的一个缓冲区相映射。从缓冲区中取数据就相当于读文件中的相应字节将数据写入缓冲区则会将数据写入文件。这样就可在不使用read和write函数的情况下使用地址指针完成I/O操作。 使用存储映射这种方法首先应通知内核将一个指定文件映射到存储区域中。这个映射工作可以通过mmap函数来实现。 mmap函数 函数作用:建立存储映射区函数原型void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);函数返回值成功返回创建的映射区首地址失败MAP_FAILED宏参数 addr: 指定映射的起始地址, 通常设为NULL, 由系统指定length映射到内存的文件长度prot 映射区的保护方式, 最常用的:读PROT_READ写PROT_WRITE读写PROT_READ | PROT_WRITEflags 映射区的特性, 可以是MAP_SHARED: 写入映射区的数据会写回文件, 且允许其他映射该文件的进程共享。MAP_PRIVATE: 对映射区的写入操作会产生一个映射区的复制(copy-on-write), 对此区域所做的修改不会写回原文件。fd由open返回的文件描述符, 代表要映射的文件。offset以文件开始处的偏移量, 必须是4k的整数倍, 通常为0, 表示从文件头开始映射。munmap函数 函数作用:释放由mmap函数建立的存储映射区函数原型:int munmap(void addr[.length], size_t length);返回值成功返回0失败返回-1设置errno值函数参数:addr调用mmap函数成功返回的映射区首地址length映射区大小mmap函数的第二个参数mmap进程间通信示例创建write.c、read.c、test.log(里边随便写一些值不能为空为空写不进去)
//使用mmap函数完成两个不相干进程间通信 write.c内容:
#include stdio.h
#include stdlib.h
#include string.h
#include sys/types.h
#include unistd.h
#include sys/wait.h
#include fcntl.h
#include sys/stat.h
#include sys/mman.hint main()
{//使用mmap函数建立共享映射区//void *mmap(void *addr, size_t length, int prot, int flags,// int fd, off_t offset);int fd open(./test.log, O_RDWR);if(fd0){perror(open error);return -1;}int len lseek(fd, 0, SEEK_END);//建立共享映射区void * addr mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);if(addrMAP_FAILED){perror(mmap error);return -1;}memcpy(addr, 0123456789, 10);return 0;
}//使用mmap函数完成两个不相干进程间通信 read.c内容:
#include stdio.h
#include stdlib.h
#include string.h
#include sys/types.h
#include unistd.h
#include sys/wait.h
#include fcntl.h
#include sys/stat.h
#include sys/mman.hint main()
{//使用mmap函数建立共享映射区//void *mmap(void *addr, size_t length, int prot, int flags,// int fd, off_t offset);int fd open(./test.log, O_RDWR);if(fd0){perror(open error);return -1;}int len lseek(fd, 0, SEEK_END);//建立共享映射区void * addr mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);if(addrMAP_FAILED){perror(mmap error);return -1;}char buf[64];memset(buf, 0x00, sizeof(buf));memcpy(buf, addr, 10);printf(buf[%s]\n, buf);return 0;
}编译后运行test.log先打开随便赋一些内容先运行write.c编译后的可执行程序再运行write.c编译后的可执行程序。