共享内存

共享内存的实现分为两个步骤:
一、 创建共享内存,使用shmget函数。

二、 映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数。
1. 创建共享内存
int shmget(key_t key ,int size,int shmflg)

key标识共享内存的键值:0/IPC_PRIVATE。当key的取值为IPC_PRIVATE,则函数shmget将创建一块新的共享内存;如果key的取值为0,而参数中又设置了IPC_PRIVATE这个标志,则同样会创建一块新的共享内存。

返回值:如果成功,返回共享内存表示符,如果失败,返回-1。

2. 映射共享内存
int shmat(int shmid,char *shmaddr,int flag)

参数:

shmid:shmget函数返回的共享存储标识符

flag:决定以什么样的方式来确定映射的地址(通常为0)

返回值:

如果成功,则返回共享内存映射到进程中的地址;如果失败,则返回-1。

3.共享内存解除映射
当一个进程不再需要共享内存时,需要把它从进程地址空间中多里。

int shmdt(char *shmaddr)

ipcs -m 查看系统中的共享内存片,结果如下:

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status

七个参数的含义如下:
共享内存的key  
共享内存的编号shmid 
创建的用户owner 
权限perms 
创建的大小bytes 
连接到共享内存的进程数nattach  
共享内存的状态status

ipcrm -m shmid 删除编号为shmid的共享内存片


#include 
#include 
#include 
#include 
#include 

int main(int argc,char * argv[])
{
	int shm_size = 66535;
	
	int shm_id = 0;
	void *shared_memory=(void *)0;  

	shm_id=shmget(IPC_PRIVATE, shm_size, 0666 ) ;
	if(shm_id < 0){  //共享内存申请失败
		fprintf(stderr,"shmget failure!");
		return -1;
	}
	fprintf(stderr,"共享内存id: %d\n",shm_id);
	system( "ipcs -m");

	/*映射共享内存*/  
	shared_memory=shmat(shm_id,(void *)0,0);  
	system("ipcs -m");

	/*删除映射共享内存*/  
	if(shmdt(shared_memory) == -1)  
	{  
		fprintf(stderr,"shmdt failed\n");  
		return -1; 
	} 
	system("ipcs -m");
	
	/*删除共享内存*/
	char str[1024];
	sprintf(str,"ipcrm -m %d",shm_id);
	system(str);	

	system("ipcs -m");
	return 0;
}

共享内存_第1张图片



你可能感兴趣的:(linux)