Linux共享内存

  • 共享内存:进程直接访问共享内存,由使用者进行访问控制(互斥等)

  • 使用ipcs命令查看系统共享内存

POSIX 共享内存

有名共享内存

  • 多个进程通过共享内存的名字来获取同一块共享内存,实现共享
#include 
#include        //memory management
#include           //include O_* macros
#include 
#include 

struct shared_data_t {
    int32_t data;
};

#define SHARED_MEM_NAME     "my_shared_memory"

int main()
{
    /*
     * 创建共享内存,其实就是一个共享文件
     * name: 不能写成/tmp/aaa.sem这样的格式,因为在linux下,sem都是创建在/dev/shm目录下
     * oflag:操作标志,包含: O_RDONLY,O_RDWR,O_CREAT,O_EXCL,O_TRUNC
     * mode: 设置创建的共享内存区对象的权限属性
     * return: 共享内存的文件描述符
     */
    int shm_fd = shm_open(SHARED_MEM_NAME,O_CREAT | O_RDWR,0666);

    //将文件的大小修改为length
    ftruncate(shm_fd, sizeof(struct shared_data_t));

    //将共享文件映射到进程内存空间
    struct shared_data_t* data = mmap(NULL, 1024, PROT_READ | PROT_WRITE,
         MAP_SHARED, shm_fd, 0);
    if(data == MAP_FAILED)
    {
        printf("mmap failed!\n");
    }

    data->data = 12;

    //解除内存的映射
    munmap(data, sizeof(struct shared_data_t));

    //删除共享内存
    shm_unlink(SHARED_MEM_NAME);

    return 0;
}

匿名共享内存

  • 通过memfd_create()创建一个匿名共享内存,通过UNIX Socket的控制消息CMSG将该文件描述符fd传递给其它进程,其它进程对该fd进行mmap操作可以的得到共享内存得地址,从而实现内存的共享。
  • man memfd_create查看函数具体说明

System V 共享内存

#include 
#include 

#define PATH_NAME "./"
#define PROJ_ID		0x666
int main()
{
	//生成一个key来唯一标识一个共享内存
	key_t key = ftok(PATH_NAME, PROJ_ID);

	//根据key创建一个共享内存,key要唯一
	int shmid = shmget(key, 4096, IPC_CREAT | IPC_EXCL);

	//将共享内存连接到进程地址空间,返回共享内存的地址
	char* shmaddr = shmat(shmid, NULL, 0);
	
	shmaddr = "hello, shared memory!";
	
	//取消共享内存和进程的连接
	shmdt(shmaddr);
	
	//删除共享内存
	shmctl(shmid, IPC_RMID, NULL);

}

你可能感兴趣的:(Linux,C语言,linux)