POSIX之共享内存

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("创建共享内存失败\n");
    } 
    printf("创建共享内存成功\n");

//第二个参数用来指定截取共享内存空间大小
    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("内存映射失败\n");
    }

    close(fd);
    
    int i=0;

    while(i<10)
    {
        sprintf((char*)ptr,"data%d",i++);
        printf("写入的数据为:%s\n",(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("创建共享内存失败\n");
    } 
    printf("创建共享内存成功\n");

    ftruncate(fd,mem_size);

    void* ptr=mmap(0,mem_size,PROT_READ, MAP_SHARED, fd, 0);
    if (ptr == MAP_FAILED) 
    {
        p_error("内存映射失败\n");
    }

    close(fd);

while(ptr++)
{
        printf("读出的数据为:%s\n",(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;
}

 

posted @ 2020-10-18 19:33  sunshine_gzw  阅读(154)  评论(0编辑  收藏  举报