第14课-信号互斥编程

1.产生背景:有些资源呗多个进程同时访问的时候,可能出现数据混乱的现象
2.定义:信号量有名信号灯。主要是用来保护临界资源(进程互斥)。进程可以根据他判定是否可以访问临界资源。还可以用于进程同步。
实质:一个数字
操作:获取和释放。利用信号量的值判断是否可以操作,大于0可以。0不可以。所以在创建操作之前一般要保证初始值是1.可以使用semctl函数来获取和设置初始值。
3.分类:
(1)二值信号量:信号灯的值只能是0和1
(2)计数信号量:信号灯的值可以取任意非负值
4.和文件的区别
(1)打开信号量得到标识符
(2)利用标识符操作信号量
5.键值:类似于文件名,要打开一个文件你要知道她的文件名,所以要打开一个信号量要知道他所属的键值。
键值指向一个信号量集合。
性质:就是一个数字,在打开信号量之前就有了。
作用:表明信号量。
指定键值:
(1)任意选择一个数
有可能被其他IPC对象用了,所以无效。
(2)ftok函数(文件名(实质是数字),项目ID)
利用文件名(Linux内核指定实际数字)和项目ID共同构造信号量集合的键值。返回的是key_t类型。
5.函数学习:

8.1 创建/打开信号量集合

8.1.1 函数名
Semget
8.1.2 函数原形
int semget(key_t key, int nsems, int semflg);
8.1.3 函数功能
获取信号量集合的标识符
当key所指定的的信号量不存在的时候,且semflg里面包含了IPC_CREAT,则会创建一个信号量集合
8.1.4 所属头文件
<sys/types.h>
<sys/ipc.h>
<sys/sem.h>
8.1.5 返回值
成功:信号量集合标识符
失败:-1
8.1.6 参数说明
Key键值(对应于信号量集合)
Nsems创建的信号量集合里包含的信号量数目。
Semflg标志,可以取IPC_CREAT标志。
8.1.7 范例代码

8.2 操作信号量

8.2.1 函数名
Semop
8.2.2 函数原形
int semop(int semid, struct sembuf *sops, unsigned nsops);
8.2.3 函数功能
操作信号量
8.2.4 所属头文件
<sys/types.h>
<sys/ipc.h>
<sys/sem.h>
8.2.5 返回值
成功:0
失败:-1
8.2.6 参数说明
Semid要操作的信号量集合的标志符(由semget返回的)
Sops执行什么操作(实质是一个数组,长度由Nsops指定
unsigned short sem_num;指明要操作哪一个信号量
short          sem_op; 正数就是释放,负数就是获取
short          sem_flg;不关心
Nsops要操作多少信号量




6.具体操作
(0)创建键值(两个进程都要指定键值,只要知道文件名和项目ID即可。)
(1)创建并打开信号量,返回int(如果已存在,则不会再次创建)
(2)打开文件
(3)获取信号量,获取失败则等待就是用操作信号量函数。注意对sops结构体的定义。
(4)访问文件(资源)
(5)释放信号量
(6)关闭文件

时间: 2024-10-10 10:00:34

第14课-信号互斥编程的相关文章

第三季-第16课-信号量互斥编程

第16课-信号量互斥编程 16.1 公示栏问题(问题引入) 1. 问题描述 这里面我们举一个小例子.在一个班级里就有一个公示栏,A同学想写“数学课考试”,B同学想写“英语课取消”.但是有一个时间,A同学只写下了“数学课”三个字,没来得及写后面的内容就出去了,但是这个时候B同学来写下了“英语课取消”.这样让同学们看来就成了“数学课英语课取消”,给班级的其他同学造成了歧义. 这也就是我们说的同时访问一个资源,造成了,数据的混乱.若是有多个进程同时访问一个资源,同样会造成这个问题. 2. 问题程序化

第三季-第15课-信号通讯编程

第15课-信号通讯编程 15.1 核心理论 1. 信号 在古老的战场上,信号是最有效,最直接的通讯方式:在linux系统中,信号(signal)同样也是最古老的进程间通讯机制. 2. 信号处理流程 进程A/内核---(1)选择信号-----(2)发送信号-----(3)处理信号----进程B. 3. 信号类型 Linux系统支持的所有信号均定义在/usr/include/asm/signal.h(展示),其中常见的信号有: SIGKILL:杀死进程 SIGSTOP:暂停进程 SIGCHLD:子进

[国嵌攻略][083][信号互斥编程]

信号量分类 1.二值信号量:信号量的值只能或0或1. 2.计数信号量:信号量的初始值大于1. 什么是键值 1.文件通过文件名来打开文件,从而得到文件的标示符:信号量通过键值来打开信号量,从而得到信号量的标示符. 2.在创建信号量的时候指定键值. 指定键值 1.选择任意数值 2.通过函数构造,例如:key_t ftok(char *fname, int id) 键值构造函数 key_t ftok(char *fname, int id) 通过文件名取出内核中对应的数值,然后与项目ID组合形成键值.

第14篇-JAVA GUI编程

第14篇-JAVA GUI编程 每篇一句 :道路一开始开辟的时候总是存在障碍的 初学心得: 原本下定决心才能开始的事情也变得理所当然 (笔者:JEEP/711)[JAVA笔记 | 时间:2017-04-25| JAVA GUI编程 ] 1.什么是界面 图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面 与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受 2.Java 基础类 JFC 的基本

Spark3000门徒第14课spark RDD解密总结

今晚听了王家林老师的第14课spark RDD解密,课堂笔记如下: Spark是基于工作集的应用抽象,RDD:Resillient Distributed Dataset是基于工作集的,spark可以对结果重用. 位置感知:spark比hadoop更精致. RDD是lazy的,是分布式函数式编程的抽象,RDD可以看做一个只读的List或者Array.产生的中间结果怎么办? 不能让 他立即计算,采用Lazy级别,只对数据处理做标记.所以RDD操作是有向的,链式的,所以Stage有1000个步骤,不

【C语言探索之旅】 第二部分第一课:模块化编程

内容简介 1.课程大纲 2.第二部分第一课: 模块化编程 3.第二部分第二课预告: 进击的指针,C语言王牌 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语言编程基础知识 什么是编程? 工欲善其事,必先利其器 你的第一个程序 变量的世界 运算那点事 条件表达式 循环语句 实战:第一个C语言小游戏 函数 练习题 习作:完善第一个C语言小游戏 C语言高级技术 模块化编程 进击的指针,C语言王牌 数组 字符串 预处理 创建你自己的变量

Linux 信号量互斥编程

所谓信号量,其实就是一个数字.内核给这个数字赋予一定的含义,让它等于不同的值时所表示的意义不同.这样就可以用它来标示某种资源是否正被使用.信号的分类其实挺多的,主要还是二值和计数器.这里讨论二值 现在有个文件,有两个进程要同时访问它.进程A 要往里面写入 "Math class is cancel",进程B 要往里面写入“English test”.正常情况下这两个信息会被完整的写入文件中.但是如果进程A写到"Math class" 就暂停,接着B进程就开始写“En

【C++探索之旅】第一部分第二课:C++编程的必要软件

 内容简介 1.第一部分第二课:C++编程的必要软件 2.第一部分第三课预告:第一个C++程序 C++编程的必要软件 经过上一课之后,大家是不是摩拳擦掌,准备大干一场了呢. 这一课我们来做一些C++开发前的准备工作. 编程的必要工具 依你看,什么软件对编程来说是必要的呢?如果你认真学了上一课,那你至少可以说出一种吧. 对了,就是编译器.这个重要的程序可以把你的源代码(用高级语言如C语言写的指令)转换成电脑可以理解的二进制码(只包含0和1的,类似 01100110001111011101010.

BeagleBone Black板第六课:C++编程控制GPIO基础

BBB板第六课:C++编程控制GPIO基础 在一上课我们通过Shell脚本编程实现了对GPIO端口的简单输出控制,实现对两个LED指示灯的交替点亮和关闭,接下来的一两节课,将通过C++程序来实现Shell脚本的功能.为了实现对应的程序控制,我查阅了好多资料,测试过程中发觉网上的一些程序套用过来总是出现各种各样的编译错误,压根就控制不了BBB板,不知是我的BBB板太新,还是以前的程序太旧.最后还是从头开始,重新研究BBB板的文件系统,找出头文件,找出所有相关的函数,终于实现GPIO的C++程序控制