栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C++服务器入门基础------7.IPC进程间通信--信号量】

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C++服务器入门基础------7.IPC进程间通信--信号量】

大学生寒假在家过于无聊,整理一下以前学过的知识,顺便复习一下,水平较低,专业性差,仅供参考,不喜勿喷(反正也没人看)。心虚啊。。。

一、信号量 (1)概念

信号量是一种变量,它只能取正整数值或0,对这些数只能进行两种操作:等待和信号

用两种记号来表示信号量的这两种操作:

P(semaphore variable) 代表等待 -1

V(semaphore variable) 代表信号 +1

(2)分类

最简单的信号量是一个只能取“0”和“1”值的变量,也就是人们常说的“二进制信号量”

可以取多种正整数值的信号量叫做“通用信号量”

(3)PV操作

假设我们有一个信号量变量sv,则pv操作的

定义如下

P(sv):如果sv的值大于零,就给它减去1;如果sv的值等于零,就挂起该进程的执行

V(sv): 如果有其他进程因等待sv变量而被挂起,就让它恢复执行;如果没有进程因等待sv变量而被挂起,就给它加1

两个进程共享着sv信号量变量。如果其中之一执行了P(sv)操作,就等于它得到了信号量,也就能够进入关键代码部分了。

第二个进程将无法进入关键代码,因为当它尝试执行P(sv)操作的时候,它会被挂起等待一个进程离开关键代码并执行V(sv)操作释放这个信号量

信号量可以理解为可用资源数量,比如说两个进程,却只有一个资源,第一个进程需要资源,进行P操作,获得资源,所以总体的信号量此时减1,变为0。此时第二个进程如果也需要资源,只能等待第一个进程使用完资源归还。当一个进程使用完资源后,执行V操作,归还资源,此时如果有进程在等待,就直接给这个进程,如果没有,信号量就加1。

二、函数

需要用到头文件

int semget(key_t key,int num_sems,int sem_flags);

int semop(int sem_id,struct sembuf * sops,size_t nsops);

int semctl(int sem_id,int sem_num,int command,...);

(1)semget函数

作用

创建一个新的信号量或者取得一个现有信号量的键值

原型

int  semget (key_t key,int num_sems,int sem_flag);

参数

key: 是一个整数值,不相关的进程将通过这个值去访问同一个 信号量

num_sems:需要使用的信号量个数,它几乎总是取值为1

sem_flags:是一组标志,其作用与open函数的各种标志很相似,它低端的九个位是该信号量的权限,其作用相当于文件的访问权限,可以与键值IPC_CREATE做按位的OR操作以创建一个新的信号量(IPC_CREAT|0766)

成功时将返回一个正数值,它就是其他信号量函数要用到的那个标识码,如果失败,将返回-1

(2)semop函数

作用

改变信号量的键值

原型

int  semop ( int sem_id,struct sembuf *sem_ops,size_t num_sem_ops);

参数

sem_id:是该信号量的标识码,也就是semget函数的返回值

sem_ops:是个指向一个结构数值的指针

Semop调用的一切动作都是一次性完成的,这是为了避免出现因使用了多个信号量而可能发生的竞争现象

sembuf结构体中的元素

struct sembuf{

short sem_num;

short sem_op;

short sem_flg;

};

sem_num是信号量的编号,如果你的工作不需要使用一组信号量,这个值一般就取为0。

sem_op是信号量一次PV操作时加减的数值,一般只会用到两个值,一个是“-1”,也就是P操作,等待信号量变得可用;另一个是“+1”,也就是我们的V操作,发出信号量已经变得可用

sem_flag通常被设置为SEM_UNDO.她将使操作系统跟踪当前进程对该信号量的修改情况

(3)semctl函数

作用

允许我们直接控制信号量的信息

原型

int semctl(int sem_id,int sem_num,int command,…);

参数

sem_id: 是由semget函数返回的一个信号量标识码

sem_num: 信号量的编号,如果在工作中需要使用到成组的信号量,就要用到这个编号;它一般取值为0,表示这是第一个也是唯一的信号量

comman:将要采取的操作动作

如果还有第四个参数,那它将是一个“union semun”复合结构

删除 semctl(sem_id,0,IPC_RMID);

semctl函数里的command可以有许多不同的

值,下面这两个是比较常用的:

SETVAL:用来把信号量初始化为一个已知的值,这个值在semun结构里是以val成员的面目传递的。

IPC_RMID:删除一个已经没有人继续使用的信号量标识码

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/743574.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号