shm_write.c:
#include<stdio.h> #include<stdlib.h> #include <stdlib.h> #include <unistd.h> #include <sys/file.h> #include <sys/mman.h> #include <sys/wait.h> void p_error(const char* str) { perror(str); exit(1); } int main(int argc,char* argv[]) { int ret; size_t mem_size = sysconf(_SC_PAGE_SIZE); int fd=shm_open("/mymen", O_CREAT|O_TRUNC|O_RDWR,0666); if(fd==-1) { perror("创建共享内存失败 "); } printf("创建共享内存成功 "); //第二个参数用来指定截取共享内存空间大小 ftruncate(fd,mem_size); void* ptr=mmap(0,mem_size,PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); /* //第一个参数为0表示系统会自动寻找空闲空间作为开始地址 //void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset); flags: 指定映射对象的类型,映射选项和映射页是否可以共享。 它的值可以是一个或者多个以下位的组合 体 MAP_SHARED 与其它所有映射这个对象的进程共享映射空间。 对共享区的写入,相当于输出到文 件。 直到msync()或者munmap()被调用,文件实际上不会被更新。 MAP_PRIVATE 建立一个写入时拷贝的私有映射。内存区域的写入不会影响到原文件。 这个标志和以 上标志是互斥的,只能使用其中一个。 MAP_LOCKED 锁定映射区的页面,从而防止页面被交换出内存。 */ //成功返回共享内存地址,失败返回MAP_FAILED if (ptr == MAP_FAILED) { p_error("内存映射失败 "); } close(fd); int i=0; while(i<10) { sprintf((char*)ptr,"data%d",i++); printf("写入的数据为:%s ",(char*)ptr); sleep(1); } ret = munmap(ptr, mem_size); //卸载共享内存 if (ret != 0) { p_error("卸载内存失败"); } // ret = shm_unlink("/mymen"); // if (ret != 0) // { // p_error("删除共享内存"); // } return 0; }
shm_read.c:
#include<stdio.h> #include<stdlib.h> #include <stdlib.h> #include <unistd.h> #include <sys/file.h> #include <sys/mman.h> #include <sys/wait.h> void p_error(const char* str) { perror(str); exit(1); } int main(int argc,char* argv[]) { int ret; size_t mem_size = sysconf(_SC_PAGE_SIZE); int fd=shm_open("/mymen",O_RDONLY,0666); if(fd==-1) { perror("创建共享内存失败 "); } printf("创建共享内存成功 "); ftruncate(fd,mem_size); void* ptr=mmap(0,mem_size,PROT_READ, MAP_SHARED, fd, 0); if (ptr == MAP_FAILED) { p_error("内存映射失败 "); } close(fd); while(ptr++) { printf("读出的数据为:%s ",(char*)ptr); sleep(1); } ret = munmap(ptr, mem_size); //卸载共享内存 if (ret != 0) { p_error("卸载内存失败"); } ret = shm_unlink("/mymen"); if (ret != 0) { p_error("删除共享内存"); } return 0; }