SystemV IPC 共享内存

本文深入解析了Linux下共享内存的创建、挂载、控制及卸载等操作,通过shmget、shmat、shmctl和shmdt四个系统调用详细阐述了共享内存的使用过程,并提供了实例代码,帮助读者理解如何在不同进程中共享数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

shmget

http://man7.org/linux/man-pages/man2/shmget.2.html
shmat

http://man7.org/linux/man-pages/man2/shmat.2.html
shmctl

http://man7.org/linux/man-pages/man2/shmctl.2.html
shmdt

http://man7.org/linux/man-pages/man2/shmdt.2.html

 

由于每个进程地址空间不同,共享内存里的指针应该保存相对地址。

示例:

#define MY_SHM_KEY    0xxxx
#define MY_SHM_SIZE   sizeof(XXXX)

int shmId = 0;
char *shmAdr;

shmId = shmget(MY_SHM_KEY, MY_SHM_SIZE, IPC_CREAT | IPC_EXCL | 0777);
if (shmId < 0)
{
	if (errno != EEXIST)
	{
		return -1;
	}
	
	shmId = shmget(MY_SHM_KEY, 0, 0);
	if (shmId < 0)
	{
		return -1;
	}
}

shmAdr = (char*) shmat( shmId, NULL, 0);
if(shmAdr == (char *)-1)
{
	if(shmctl(shmId, IPC_RMID,0) < 0)
	{
		......
		return -2;
	}
	......
	
	return -1;
}

参考文献:

https://ubuntuforums.org/showthread.php?t=1671019&page=2

https://stackoverflow.com/questions/10776762/pointers-inside-shared-memory-segment

http://www2.phys.canterbury.ac.nz/dept/docs/manuals/unix/DEC_4.0e_Docs/HTML/MAN/MAN4/0167____.HTM

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值