Linux系统编程之mmap介绍和使用mmap实现进程间通信教程,linuxmmap
Linux系统编程之mmap介绍和使用mmap实现进程间通信教程,linuxmmap
mmap函数介绍
这个函数有啥子作用?m-> memory 内存,map ->映射,见名知义,就是创建内存映射区,作用就是:将磁盘文件的数据映射到内存,用户通过修改内存就能修改磁盘文件。所以我们可以用mmap来修改文件,也可以用于进程间通信!
函数原型
void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);看上去参数比较多,我们理解了也就没啥子了。
void *addr:映射区的首地址,你知道么?肯定不知道创建了才有,传NULL
size_t length:映射区的大小,可以传文件大小,也可以自己自己指定,单位是byte。不能为0。
int prot:映射区权限,可以为:PROT_READ 映射区必须要有读权限,PROT_WRITE,PROT_READ|PROT_WRITE
int flags:标志位参数,可以为MAP_SHARED 修改内存数据会同步到磁盘。MAP_PRIVATE 修改了内存数据不会同步到磁盘。
int fd:文件描述符,要映射的文件对应的id。通过open函数得到
off_t offset:映射文件的偏移量,要么为0 要么为4k的整数倍.
munmap函数
创建了内存映射区,当然也要对应的释放内存映射区的操作,这里就用的munmap了。比较简单,直接看函数原型:
int munmap(void *addr, size_t length);
addr 为映射区地址就是 mmap返回值,length 就是 mmap 中你指定的长度。
使用mmap实现进程间通信
我们用mmap来实现 2个 进程间的通信,一个进程写数据,另一个进程读数据。我们这里让write 进程每次sleep 1s,read进程每次sleep 2s,这样更能看见效果。
mmap_file_write.c
#include#include #include #include #include #include int main(void) { int fd = open("temp",O_RDWR|O_CREAT,0664); if(fd==-1) { perror("open hello"); exit(1); } ftruncate(fd,4096); int len = lseek(fd,0,SEEK_END); void* ptr = mmap(NULL,len,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); if(ptr == MAP_FAILED) { perror("mmap error"); exit(1); } char* temp = (char*)ptr; int i = 1; while(1) { //对映射区进行写操作 char str[1024]={0}; sprintf(str,"This is line %d",i); strcpy(temp,str); //temp[0] = 'a'; printf("写入数据:%s\n",temp); temp += strlen(str); sleep(1); i++; } //释放内存映射区 int ret = munmap(ptr,len); if(ret==-1) { perror("munmap"); exit(1); } close(fd); return 0; }
mmap_file_read.c
#include#include #include #include #include #include int main(void) { int fd = open("temp",O_RDWR|O_CREAT,0664); if(fd==-1) { perror("open hello"); exit(1); } ftruncate(fd,4096); int len = lseek(fd,0,SEEK_END); void* ptr = mmap(NULL,len,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); if(ptr == MAP_FAILED) { perror("mmap error"); exit(1); } char* temp = (char*)ptr; while(1) { //对映射区进想读操作 char str[1024] = {0}; strcpy(str,temp); printf("%s\n",str); temp+=strlen(str); sleep(2); } int ret = munmap(ptr,len); if(ret==-1) { perror("munmap"); exit(1); } close(fd); return 0; }
评论暂时关闭