mmap实现进程通讯
来源:互联网 发布:电池测试系统算法软件 编辑:程序博客网 时间:2024/06/07 23:39
#include <stdio.h>#include <string.h>#include <sys/mman.h>#include <sys/types.h>#include <fcntl.h>#include <unistd.h>#include <string.h>typedef struct{ unsigned int size; char* content;}myshmem;typedef struct{ char name[128]; unsigned int size; unsigned int avaliable; char start[0];}mem_head;typedef enum{ READ = PROT_READ, WRITE = PROT_WRITE}MODE;int mem_size;char mem_name[128];void* createHandle(const char* name, unsigned int size, MODE mode) // map a normal file as shared mem:{ int fd,exist; if(size < sizeof(mem_head)){ //printf("size must large than %d\n",sizeof(mem_head)); return NULL; } if(strlen(name) > 128){ printf("size of name must small than 128\n"); return NULL; } mem_size = size; strcpy(mem_name,name); fd = open(name, O_CREAT|O_RDWR, 00777); if(fd < 0 ){ printf("open %s failed\n",name); return NULL; } unsigned int len = size + sizeof(mem_head); lseek(fd, len - 1, SEEK_SET); write(fd,"",1); char* handle = (char*)mmap( NULL, len, mode, MAP_SHARED, fd, 0 ); close( fd ); if(handle == NULL){ printf("mmap error\n"); return NULL; } printf("initialize over\n"); return (void*)(handle);}void destoryHandle(void* handle){ mem_head* head = (mem_head*)handle; unsigned int len = head->size + sizeof(mem_head); munmap(handle, len); printf( "umap ok \n" );}int writeHandle(void* handle, const char* content, unsigned int len){ //printf("writeHandle :%s %d\n",content, len); mem_head* head = (mem_head*)handle; if(head != NULL ){ if(strcmp(head->name,mem_name)){ strcpy(head->name,mem_name); head->avaliable = 0; } if(head->size != mem_size){ head->size = mem_size; head->avaliable = 0; } } else{ printf("get mem_head failed\n"); return -1; } //printf("size:%d avaliable:%d name:%s\n",head->size,head->avaliable,head->name); if(head->size < (head->avaliable + len)){ printf("share memory is full ,can not write\n"); return -1; } if(head->start == NULL){ printf("head->start is null\n"); return -1; } memcpy(head->start + head->avaliable , content, len); //printf("write successed:%s\n",head->start); head->avaliable += len; return len;} int readHandle(void *handle, char* content, unsigned int offset, unsigned int len){ printf("readHandle\n"); mem_head* head = (mem_head*)handle; if(head == NULL){ printf("head is null\n"); return -1; } if(strcmp(head->name,mem_name) || head->size != mem_size || head->avaliable <= offset){ printf("there is no content to read\n"); return 0; } //printf("name:%s size:%d avaliable:%d \n",head->name,head->size,head->avaliable); if(head->start == NULL){ printf("start is NULL\n"); return -1; } unsigned int length = head->avaliable > (offset + len) ? len : (head->avaliable - offset); printf("%d\n",length); memcpy(content, head->start + offset, length); printf("read over\n"); return length;}int main(int argc, char** argv){ int i = 0; if(strstr(argv[0],"write")){ printf("start write\n"); char* handle = (char*)createHandle(argv[1],1024*3,WRITE); if(handle == NULL){ printf("createHandle failed\n"); return -1; } while(writeHandle(handle, "hello",sizeof("hello") -1)){ sleep(1); } printf("write hello\n"); sleep(10); destoryHandle(handle); return 0; }else{ printf("start read\n"); char* handle = (char*)createHandle(argv[1],1024*3,READ); if(handle == NULL){ printf("getHandle failed\n"); return -1; } char buffer[10] = {0}; int len = 0; while((len = readHandle(handle,buffer,len,sizeof(buffer))) > 0){ printf("read :%s\n",buffer); sleep(1); } printf("readHandle:%d %s\n ",len,buffer); destoryHandle(handle); } return 0;}
阅读全文
0 0
- mmap实现进程通讯
- mmap实现进程间共享内存
- 使用mmap实现进程间通信
- Linux进程共享通信 -- mmap实现
- Linux--mmap实现进程间通信
- 管道实现进程间通讯
- 管道实现进程间通讯
- SenndMessage实现进程间通讯
- 进程间通讯实现方法
- 进程间通讯实现方法
- 管道实现进程间通讯
- 内存映射实现进程通讯
- 知识点查缺补漏贴01-进程间通讯之mmap文件共享
- 多进程和mmap 实现copy的demo
- [转] linux下使用mmap实现进程间共享内存
- 进程通信----共享内存以及mmap函数实现共享内存
- mmap实现多进程对大文件拷贝
- Messenger 实现Activity与Service通讯、进程通讯
- 考研英语善变的more than:后加词性不同,意思有变
- js基础
- 类 TreeMap<k,v> 遍历 TreeMap<String,String> 和TreeMap<Person,Person>
- k-近邻算法
- ubuntu--software
- mmap实现进程通讯
- 2017考研复试面试:如何在专业知识环节脱颖而出
- 权势二进制
- Android内存优化
- Genymotion与android studio
- Android源码分析
- ACM学习心得
- 卢卡斯定理(Lucas)
- 流程控制(部分)