进程间通信方式之信号量基本知识


前言

接下来介绍进程间通信最后一种方式----》信号量


提示:以下是本篇文章正文内容,下面案例可供参考

一、引入

1.概念:

信号量用来协调多个进程对于共享资源的访问(保证每一次只有一个进程在访问共享资源)

2.特点:

1)如果信号量值为0,还要再做减法操作(p操作),会阻塞当前进程
2)信号量的值是不可能为负数的,做减法的时候,如果超过信号量的大小会阻塞当前进程
3)信号量做加法操作(v操作)是不会阻塞当前进程的

二、相关的接口函数

1.申请信号量

 #include <sys/sem.h>
   int semget(key_t key, int nsems, int semflg);
   参数:nsems(重点) --》你打算申请多少个信号量,信号量的编号从0开始
   例如:semget(5415,2,IPC_CREAT|IPC_EXCL|0777);  //我申请了两个信号量,编号分别0,1

2.操作使用信号量

int semop(int semid, struct sembuf *sops, size_t nsops);
      参数:struct sembuf(重点)
         {
               sem_num;  //你要操作信号量的编号,默认从0开始
               sem_op; //你想对信号量进行何种操作?两种操作
                                 加法操作---》V操作
                                 减法操作---》P操作
                sem_flg; //默认设置为  SEM_UNDO
         }
            nsops --》 struct sembuf结构体的个数,一般设置为1

3.信号量赋值,获取信号量的值

int semctl(int semid, int semnum, int cmd, ...);
     参数:semnum --》信号量的序号
               cmd --》 GETVAL        获取信号量的值
                             SETVAL        设置信号量的值
                             IPC_STAT      获取信号量的属性
                             IPC_SET        设置信号量的属性
                             IPC_RMID     删除信号量

第一个功能:设置信号量的值
semctl(semid,0, SETVAL,1); //把第一个信号量(序号是0)的值设置为1
第二个功能:获取信号量的值
int ret=semctl(semid,0,GETVAL); //获取第一个信号量的值,返回值就是第一个信号量的值

三、具体代码实例

#include "myhead.h"

int main()
{
	int semid;
	struct sembuf mybuf;
	bzero(&mybuf,sizeof(mybuf));
	mybuf.sem_num=0;  //信号量的序号
	mybuf.sem_op=2;  //我想对信号量做减法
	mybuf.sem_flg=SEM_UNDO;
	
	//创建一个信号量
	semid=semget(7454,1,IPC_CREAT|IPC_EXCL|0777);
	if(semid==-1)
	{
		if(errno==EEXIST)
			semid=semget(7454,1,0777);
		else
		{
			perror("创建信号量失败");
			return -1;
		}
	}
	
	//给刚才申请的那个信号量赋值
	semctl(semid,0,SETVAL,3);  //我把信号量的值设置为3
	//打印刚才信号量的值
	printf("信号量值为:%d\n",semctl(semid,0,GETVAL));
	
	//对这个信号进行减法操作
	semop(semid,&mybuf,1);
	printf("做了一次减法信号量值为:%d\n",semctl(semid,0,GETVAL));
	
	//对这个信号进行减法操作
	semop(semid,&mybuf,1);
	printf("做了一次减法信号量值为:%d\n",semctl(semid,0,GETVAL));
	
	//对这个信号进行减法操作
	semop(semid,&mybuf,1);
	printf("做了一次减法信号量值为:%d\n",semctl(semid,0,GETVAL));
	
	
	//对这个信号进行减法操作
	semop(semid,&mybuf,1);
	printf("做了一次减法信号量值为:%d\n",semctl(semid,0,GETVAL));
}

总结

以上就是今天要讲的内容,本文仅仅简单介绍了进程间通信方式的一种----》信号量,其他内容请各位大神移步本博客的其他文章,或是留言并关注博主,等待后续发布。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值