Linux系统编程:mmap介绍和使用mmap实现进程间通信
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 <stdio.h> #include <unistd.h> #include <string.h> #include <sys/mman.h> #include <fcntl.h> #include <stdlib.h>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 <stdio.h> #include <string.h> #include <sys/mman.h> #include <unistd.h> #include <stdlib.h> #include <fcntl.h>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; }進程間通信效果
總結
以上是生活随笔為你收集整理的Linux系统编程:mmap介绍和使用mmap实现进程间通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《论文笔记》Multi-UAV Coll
- 下一篇: 基于visual c++之windows