【UNIX】什么是IPC对象以及共享内存

本文介绍了SysV IPC机制中的共享内存实现原理及步骤。包括创建/打开共享内存、映射共享内存、撤销映射以及删除共享内存对象的过程。通过具体代码示例展示了如何使用系统调用进行共享内存的操作。

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

sys V 的IPC 对象:对于内核中创建的文件对象,就是文件标识符(它引用了文件对象的全部信息)在进程中文件描述符一般使用当前最小可用值。

对于IPC标识符返回的是索引的整数值,它是全局变量的流水号,在系统中唯一分配的,若果在创建的IPC对象没有关闭,他会全局存在,只有在系统关闭的时候才关闭,这样会造成内存空间的资源被占用。

为了进程之间交换信息,内核专门留了一块内存空间,由进程映射到各自进程私有空间。

【共享内存的实现】:

1)创建/打开共享内存,这里的创建/打开和文件的创建/打开差不多,只是换了一种说法,都是在内核空间创建有一个缓存空间,提供要交换的信息

2)映射共享内存的内容,就是把共享内存的内容映射到进程的地址空间用于访问

3)撤销共享内存的映射,就是解挂的含义,进程不需要再访问共享内存的时候

4)删除共享内存的对象,就是内核系统在内存空间创建的文件描述符

具体代码如下:

/*
* key_t ftok(const char *pathname,int proj_id)
* ID是约好的ID号,可以是两个进程去访问, 
*_key(IPC_PRIVATE)父子进程之间的KEY值,不需要通过ftok函数得到
* KEY值表示IPC标识符
*

* int shmget (key_t key,int size,int shmflag);
* 这里的shmget 就像文件IO中的open函数
* key值就是ftok函数返回的值,等同以fork函数的fd
* size表示共享内存开的大小
* shmflag 表示open的权限位

* int shmat(int shmid,const void *shmaddr,int shmflag)  (attch挂载的含义)
* shmid表示要映射的内存共享去的标识符(shmget 返回标识符)
* shmaddr表示共享内存区要映射到进程空间指定地址(赋空NULL表示系统自动完成映射)
* shmflag 设置内存空间的读写权限(SHM_RDONLY,0表示共享内存可读写)
*

* int shmdt(const void *shmaddr)
* 这里撤销映射地址空间的shmaddr是shmat 函数的返回地址
* shmadd = (char *)shmat (shmid,NULL,0)
*

* int shmctl(int shmid,int cmd,struct shmid_ds *buf)
* shmid 是要操作的共享内存标识符
* cmd 表示获取对象的属性,一般是删除对象IPC_RMID
* buf 表示指定IPC_STAT/IPC_SET时用以保存/设置属性 (一般赋空NULL)
*
/

#include 
#include 	/* shmget, shmctl */
#include 	/* fork */
#include 	/* printf */
#include 	/* exit */

#define BUFSZ		2048

int main()
{
	pid_t	pid;
	int	shmid;
	
	if((shmid = shmget(IPC_PRIVATE, BUFSZ, 0666)) < 0){
			perror("shmget");
			exit(-1);
	}
	printf("process(pid=%d) created shared-memory id=%d\n",
			getpid(), shmid);
	
	if ((pid = fork()) < 0) {
		perror("fork error");
		exit(1);
	}
	
	if (pid == 0) {
		printf("process(pid=%d) inherited shared-memory id=%d\n",
			getpid(), shmid);
					
	} else {
		sleep(1); /* just for display */
		printf("ready to show IPC share memory status?");
		getchar();

		printf("two processes get the same shared memory object\n");
		printf("------ Shared Memory Segments --------\n");
		printf("key        shmid      owner      "\
			"perms      bytes      nattch     status\n");
		system("ipcs -m | grep 666");
		
		printf("ready to terminate?");
		getchar();
		
		if (-1 == shmctl(shmid, IPC_RMID, NULL)) {
			perror("shmctl error");
		}
		
		printf("removed shared-memory\n");
		printf("------ Shared Memory Segments --------\n");
		printf("key        shmid      owner      "\
			"perms      bytes      nattch     status\n");
		system("ipcs -m | grep 666");

	}

	exit(0);
}
/*
* char *shmadd
* shmadd = (char *)shmat(shmid,NULL,0) <(char *)0 映射地址空间
* shmdt(shmadd) 撤销/解除进程与共享空间的映射关系
* shmctl(shmid,IPC_RMID,NULL) 删除IPC共享内存空间
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值