linux网络编程之system v信号量(一)
今天起,学习信号量相关的知识,下面开始:

关于信号量,在前面已经介绍过了,这里回顾一下:

通过上面的描述,很容易就能想到信号量的一上数据结构:

下面再来回顾一下P、V原语:


所谓的原语就是指这段代码是原子性的,是不会被其它信号中断的,

在Linux中,system v 信号量是以信号量集来实现的,跟其它system v IPC对象一样,也有自己的数据结构:

同样的,信号量集也提供了一些函数来操作:


下面一一对其进行学习:


下面用具体代码来实践一下,会封装一些对信号量集的一些函数:

编译运行:


另外,可以用命令来删除已经创建的信号量集,跟消息队列一样(ipcrm -S key 或ipcrm -s semid两种):


下面创建了之后,则可以封装一个打开信号量集的方法:

当创建了一个信号量集,并里面有一个信号量时,这时候最想做的事情是对进信号量设置一个计数值,于是第二个函数出现了:



其中先看下SETVAL参数,查看MAN帮助:

于是将其结构体拷贝一下,来给信号集来设置一个计数值:

有了设置计数值,那接下来就可以用GETVAL来获取信号量集中的信号量的计数值:

接下来封装一个删除指定的信号量集,注意:不可以直接删除某个信号量,只能删除一个信号量集,并将里面所有的信号量给删除了,如下:

下面则在main中修改一下,来实验下删除功能是否有效:

编译运行一下:

可以看出五秒之后,已经成功删除了信号集。
接下来第三个函数是一个比较核心的函数,用来进行P、V操作的:



下面用它来封装一下P、V操作:

下面对其sembuf进行进一步说明:

其中sem_op表示我们要操作的方式,而代码中我们写的是-1跟+1,实际上还可以-2,-3,+2,+3,减一个大于零的数字,表示要将信号量的数值减去相应的值,如果当前的个数小于计数值时则会阻塞,处于等待状态,当前前提是sem_flg等于0,如果sem_flg为IPC_NOWAIT而又没有可用资源时,这时semop函数就会返回失败,返回-1,并且错误代码为EAGAIN;而当sem_flg为SEM_UNDO,表示撤消,当一个进程终止的时候,对信号量所做的P或V操作会被撤消, 比如我们对信号进行了一个P操作,对其进行了-1,当进程结束时,最后一次-1将会被撤消,同样的,如果进行了一个V操作,也就是对其进行了+1,当进程结束时,最后的一次+1则会被撤消。
接下来再通过一个例子,来更好的理解信号量的一些机制:

在看代码之前,先看一下该示例的一个实际效果:

当运行此程序时,会给出命令使用方法,带不同的参数则会有不同的功能,下面具体解释一下:
①、创建一个信号量集
②、删除一个信号量集
③、进行一个P操作
④、进行一个V操作
⑤、对信号量集中的信号量设置一个初始的计数值
⑥、获取信号量集中信号量的计数值
⑦、查看信号量集的权限
⑧、更改信号量集的权限
下面则具体来使用一下:




下面继续往下减:


但是并不能无限往上加,整数的最大值是有限制的,实际上计数值内部是一个short类型,也就是范围为-32768~32767



接下来分析下程序,首先解析参数:


其中查看一下ftok函数帮助:

这里用"s"一个字符的低八位可以确何不为0,而“.”表示当前路径,两个参数通过ftok就可以产生唯一的一个key_t,至于内部怎么实现不需要关心。
接下来来判断这些参数选项:

【说明】:关于这里面用到的方法全是上面封装的
下面两个参数是还没有在上面进行封装过,关于权限的获取和设置,下面来看下:

其中来看一下具体函数的实现:

其中权限保存的字段可以从man帮助中查看到:

所以很容易理解,下面为了进一步演示信号量的其它P、V用法,下面更改一下程序:

下面编译来看下效果:


下面来看下它的效果:

也就是所做的最后一次操作将会被撤消,同样的,对于v操作这个SEM_UNDO也同样适用,这里就不演示了。
好了,今天先学到这,今天是2015年的第一天,用全心的心情去迎接这美好的新年,明天和小伙伴们去滑雪,想来就刺激, 为了积聚能量,早点睡啦~
linux网络编程之system v信号量(一)的更多相关文章
- linux网络编程之system v信号量(二)
今天迎来元旦假期的最后一天了,过得好快~昨天跟小伙伴们在军都滑雪陪儿爽,虽说上了两回中级道都摔得异常的惨烈,但是在初级道上学习"s"转弯还是有一些小心得,可以在要往高手迈进的前提, ...
- linux网络编程之system v共享内存
接着上次的共享内存继续学习,这次主要是学习system v共享内存的使用,下面继续: 跟消息队列一样,共享内存也是有自己的数据结构的,system v共享内存也是随内核持续的,也就是说当最后一个访问内 ...
- linux网络编程之system v消息队列(二)
今天继续学习system v消息队列,主要是学习两个函数的使用,开始进入正题: 下面则开始用代码来使用一下该发送函数: 在运行之前,先查看一下1234消息队列是否已经创建: 用上次编写的查看消息队列状 ...
- linux网络编程之system v消息队列(一)
经过上次对于进程通讯的一些理论的认识之后,接下来会通过实验来进一步加深对进程通讯的认识,话不多说,进入正题: 其实还可以通过管道,但是,管道是基于字节流的,所以通常会将它称为流管道,数据与数据之间是没 ...
- linux网络编程之shutdown() 与 close()函数详解
linux网络编程之shutdown() 与 close()函数详解 参考TCPIP网络编程和UNP: shutdown函数不能关闭套接字,只能关闭输入和输出流,然后发送EOF,假设套接字为A,那么这 ...
- Linux IPC实践(11) --System V信号量(1)
信号量API #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semget ...
- (十)Linux 网络编程之ioctl函数
1.介绍 Linux网络程序与内核交互的方法是通过ioctl来实现的,ioctl与网络协议栈进行交互,可得到网络接口的信息,网卡设备的映射属性和配置网络接口.并且还能够查看,修改,删除ARP高速缓存的 ...
- linux网络编程之socket编程(四)
经过两周的等待,终于可以回归我正常的学习之旅了,表哥来北京了在我这暂住,晚上回家了基本在和他聊天,周末带他在北京城到处乱转,几乎剥夺了我自由学习的时间了,不过,亲人之情还是很难得的,工作学习并不是生活 ...
- linux网络编程之socket编程(六)
经过一个国庆长假,又有一段时间没有写博文了,今天继续对linux网络编程进行学习,如今的北京又全面进入雾霾天气了,让我突然想到了一句名句:“真爱生活,珍惜生命”,好了,言归正传. 回顾一下我们之间实现 ...
随机推荐
- linux 使用jar 打包成war
把当前目录下的所有文件打包成game.war jar -cvfM0 game.war ./ -c 创建war包 -v 显示过程信息 -f -M -0 这个是阿拉伯数字,只打包不压缩 ...
- LeetCode 897. 递增顺序查找树(Increasing Order Search Tree)
897. 递增顺序查找树 897. Increasing Order Search Tree 题目描述 给定一个树,按中序遍历重新排列树,使树中最左边的结点现在是树的根,并且每个结点没有左子结点,只有 ...
- win10改装win7
参考链接: https://jingyan.baidu.com/article/3ea51489d0f3c852e61bba01.html 1. 制作win7 U盘启动盘 2. 设置BIOS 1:OS ...
- (一)Shiro,久闻其名,而今初相识
文章目录 shiro简介 功能介绍 从外部看 Shiro 架构 从内部看 Shiro 架构 多说一句,在学习shiro之前,我觉得应该先用 filter ,自己动手写过粗粒度的权限系统,而不要一上来就 ...
- Python-03-流程控制
一.if判断语句 1. if...else if 条件: 满足条件时要做的事情1 满足条件时要做的事情2 ...... else: 不满足条件时要做的事情1 不满足条件时要做的事情2 ...... # ...
- python学习-60 面向对象设计
面向对象设计 1.三大编程范式 --面向过程编程 --函数式编程 --面向对象编程 2.编程进化论 --编程最开始就是无组织无结构,从简单控制流中按步写指令 --从上述的指令中提取重复的代码快或逻辑, ...
- Python进阶:值传递,引用传递?不存在的,是赋值传递
Python的变量及其赋值 c/c++/c#/java 里面都有值传递,引用传递的概念,在Python中是如何的? 例 a = 1 b = a print(id(a),id(b)) #14072334 ...
- PAT(B) 1043 输出PATest(Java)统计
题目链接:1043 输出PATest (20 point(s)) 题目描述 给定一个长度不超过 104 的.仅由英文字母构成的字符串.请将字符重新调整顺序,按 PATestPATest- 这样的 ...
- hadoop 空间配置
hadoop-------------- 分布式计算框架. common // hdfs //存储 mapreduce //MR,编程模型. yarn //资源调度. 集群部署----------- ...
- linux根文件系统的挂载过程详解
一:前言 前段时间在编译kernel的时候发现rootfs挂载不上.相同的root选项设置旧版的image却可以.为了彻底解决这个问题.研究了一下rootfs的挂载过程.特总结如下,希望能给这部份知识 ...