进程间的通信----System V 共享内存、信号量

System V共享内存

  • 共享内存是进程间的一种通信方式,多个进程共同使用同一块“共享空间”,共享空间存在于内核,随内核的持续性。
  • 共享内存的使用方法和步骤:
    1.申请一个“key,许可证”
	//生成一个IPC的key
	key_t key = ftok(PATHNAME ,PRO_ID);
	if(key == -1)
	{
		perror("ftok failed");
		exit(-1);
	}

使用ftok函数来向操作系统申请一个key
2.创建或打开一个System V共享内存的对象,其实就是获取对象的id号

//利用key创建或者打开IPC对象(共享内存对象)
	int shm_id = shmget(key,1024,IPC_CREAT | 0664);
	if(-1 == shm_id)
	{
		perror("shmget failed");
		exit(-1);
	}

3.映射/解映射到用户的进程空间

//映射到自己的进程地址空间
	char *p = (char *)shmat(shm_id, NULL, 0);
	if(p == NULL)
	{
		perror("shmat failed");
		exit(-1);
	}

*4.其他的操作
使用shmctl函数可以删除一个IPC对象,设置和获取属性,详情可以man一下。

System V 信号量

  • 信号量是为了保护共享资源而存在的,是一种进程间的通信方式,这种方式不是用来传递数据的,是一种提供给不同进程或者同一个进程中不同线程之间的同步(避免竞争资源)的一种机制。

信号量的使用步骤(方法):
1.申请一个“key,许可证”

//申请一个System V信号量的“key”
key_t key = ftok(PATHNAME,PRO_ID);
	if(key == -1)
	{
		perror("ftok failed");
		exit(-1);
	}

2.创建或者打开一个System V的信号量(返回值为一个id号)

//2.创建或者打开一个systemV的信号量
	int sem_id = semget(key_sem,1,IPC_CREAT | 0664);
	if(sem_id == -1)
	{
		perror("semget failed");
		exit(-1);
	}

3.其他的操作:利用sem_ctl函数来设置,获取计数信号量集中的某一个或者某一些信号量的值,信号量的值表示可以被多少个进程同时访问。

信号量是为保护共享资源有序访问而创建的,所以我们怎么样才能保护共享内存当中的数据呢?
当某一个进程要访问共享内存当中数据时,会进行P操作将共享内存的数据进行一个“上锁”,当数据访问结束后,会进行V操作将共享内存的数据进行一个“解锁”。上锁表示,该共享数据暂时不能够被访问,只有当解锁后,该共享区域才能够被重新访问。
所以接下介绍一下P操作和V操作!!!
P操作(上锁):

//进行P操作
		//将存储信号集的结构体定义号后
		struct sembuf sops;
		sops.sem_num = 0;
		sops.sem_op = -1;
		sops.sem_flg = 0 | SEM_UNDO   ;

P操作是定义一个结构体变量,将变量的值初始化。当sops.sem_op小于零时表示进行P操作

V操作(解锁):

//进行V操作
		//将存储信号集的结构体定义号后
		struct sembuf sops;
		sops.sem_num = 0;
		sops.sem_op = 1;
		sops.sem_flg = 0 | SEM_UNDO   ;

V操作是定义一个结构体变量,将变量的值初始化。当sops.sem_op大于零时表示进行V操作

每日一句:人生始终充满战斗激情

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值