信号量互斥编程

在程序中利用信号量互斥来解决公示板问题

背景知识

1、信号灯的概念

信号灯,又被称为信号量(semaphore),是IPC(进程间通信)的方式之一。它可以用来保证两个或多个关键代码段不被多个进程并发调用。每个信号灯都有个semval,用于记录信号灯的值。在进入一个关键代码段之前,进程必须获取一个信号量,使semval减1;一旦该关键代码段完成了,那么该进程必须释放信号量,使semval加1.其它想进入该关键代码段的进程,如果semval是0,就必须等待直到第一个进程释放信号量。

2、信号灯的用法

使用共享内存进行进程间通讯一般会经历下面几步:

1)建立信号灯集:进程通过调用函数semget来创建或者获得一个信号灯集;

2)初始化semval:通过semctl使用SETVAL命令来初始化信号灯的值(semval);

3)获取与释放semval:通过函数semop来获取或者释放信号灯,其中获取对应于semval值减1,释放对应于semval值加1.

4)删除信号灯集:当进程结束使用信号灯时,使用semctl通过IPC_RMID命令来删除它。

3、函数参考表

semget:

函数功能:创建与打开信号灯集

头文件:#include<sys/types.h>

#include<sys/ipc.h>

#include<sys/sem.h>

函数原型:int semget(key_t key,int nsems,int semflg);

参数说明:key:表示信号灯集的键值。当key的取值为IPC_PRIVATE,则函数semget()将创建一个新的信号灯集。

nsems:表示创建的信号灯集中的信号灯个数。

semflg:表示的操作类型,也可用于设置信号灯的访问权限,两者通过‘|‘连接表示。

返回值:成功,则返回信号灯的IPC标识符。失败,则返回-1,errno存储错误原因。

EACCESS:没有权限

EEXIST:信号灯集已经存在,无法创建。

EIDRM:信号灯集已经删除。

ENOENT:信号灯集不存在,同时没有使用IPC_CREAT.

ENOMEM:没有足够的内存创建新的信号灯集。

ENOSPC:超出限制。

ftok:

函数功能:通过将文件路径名和子序号,获得System V IPC 键值(即创建消息队列、共享内存所用的键值)

#include<sys/types.h>

#include<sys/ipc.h>

函数原型:key_t ftok(const char *pathname,int proj_id);

参数说明:pathname:指定的带路径的文件名。

proj_id:子序号id,或称工程id。

如指定文件的索引节点号为65538,,换算成16进制为0x010002,而指定的ID值为38,换算成16进制为0x26,则最后的key_t返回值为0x26010002。

返回值:成功,则返回System V IPC键值。失败,则返回-1,errno储存错误原因。

semop

函数功能:信号灯的操作函数

头文件:#include<sys/types.h>

#include<sys/ipc.h>

#include<sys/sem.h>

函数原型:int semop(int semid,struct sembuf *sops,unsigned nsops);

参数说明:semid:待操作的信号灯集ID。

sops:指向待操作的信号灯结构体(数组)。sembuf结构体包含了对于某个信号灯操作方法的信息,其成员如下:

unsigned short sem_num;//信号灯编号,从0开始

short sem_op;//为正时,代表释放的信号灯值,为负时代表获取是信号灯值

short sem_flg;//操作的标识

nsops:表示要操作的信号灯数。

返回值:成功时,这个函数返回共享内存的起始地址,失败时返回-1.

semctl

函数功能:信号灯的控制

头文件:#include<sys/types.h>

#include<sys/ipc.h>

#include<sys/sem.h>

函数原型:int semctl(int semid,int semnum,int cmd,union semun arg);

参数说明:

semid:信号灯集的ID.

semnum:操作的信号灯编号。

cmd:是控制命令,常用的命令有

IPC_RMID:将信号灯集从内存中删除。

GETPID:获得sempid

GETVAL:获得semval

SETVAL:设置semval

arg:是一个共同体类型的副本。其中各个量的使用情况和参数cmd的设置有关。

返回值:失败时返回-1,成功返回与cmd相关的正数,例如:

GETPID:返回sempid

SETVAL:返回semval

st1.c

st2.c

执行st1,进入睡眠

st2去获取信号量失败,则进行阻塞

当st1程序操作完成并释放了信号量之后,则st2重新获取信号量成功后,才得到运行。

查看board.txt文件

时间: 2024-11-11 05:36:49

信号量互斥编程的相关文章

Linux 信号量互斥编程

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

linux应用开发-信号量互斥编程

linux应用开发-信号量互斥编程 一 相应的函数 1 创建/打开信号量集合 函数名 semget 函数原形 int semget(key_t key, int nsems, int semflg) 函数功能 获取信号量集合的标识符 当key所指的信号量不存在的时候,且semflg里包含了IPC_CREAT,就会创建一个信号量的集合 所属头文件 <sys/types.h> <sys/ipc.h> <sys/sem.h> 返回值 成功返回信号量的标识符 失败返回-1 参数

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

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

16.信号量互斥编程

我们先来看一个例子.就是两个进程访问同一个文件,由于线程的先后,导致内容的异常.即是数据内容的混乱. Student1.c: #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> ? void main(){ ????//open file ????int fd = 0; ????fd = open("/home/wen",O

Linux 信号量同步编程

前一篇文章概述了Linux 系统中信号量互斥编程,这篇文章正好是前一篇的姊妹篇----信号量同步.说它们是姊妹篇是因为它们都是利用了内核的信号量机制实现了进程间的通信.因为两者所解决的问题不同,因此它们使用的场景就会有所区别. 信号量互斥主要解决的问题是:进程间需要同时访问某种资源,但是它们对资源的操作会互相影响对方的操作结果,因此需要一种机制实现让进程在访问资源时能禁止其他进程访问相同的资源.而信号量同步则解决了另一个经典问题:生产者和消费者之间的协同工作问题. 首先描述一下生产者和消费者问题

信号量互斥,王明学learn

信号量互斥 信号量(又名:信号灯)与其他进程间通信方式不大相同,主要用途是保护临界资源(进程互斥).进程可以根据它判定是否能够访问某些共享资源.除了用于访问控制外,还可用于进程同步. 一.信号量分类 二值信号灯:信号灯的值只能取0或1 计数信号灯:信号灯的值可以取任意非负值. 二.函数学习 2.1创建/打开信号量 2.1.1 函数名 semget 2.1.2 函数原形 int semget(key_t key,int nsems,int semflg); 2.1.3 函数功能 获取信号量集合标示

第三季-第17课-信号量同步编程

第17课-信号量同步编程 17.1 核心概念--进程同步 一组并发进程进行互相合作.互相等待,使得各进程按一定的顺序执行的过程称为进程间的同步. 17.2 生产者消费者问题 1. 问题描述 这里面有两个角色:生产者和消费者.假设生产者生产的产品需要两步才能完成并且使用.但是,当生产者刚刚完成了对产品的第一步加工的时候,产品就被消费者买走了.可是他们之间并没有相应的沟通,这就导致,消费者会以为他买到了完成的产品. 2. 程序化 在文件夹里面创建producer.c和customer.c文件,同时创

第15课-信号量同步编程

1.进程同步:各进程按照一定的顺序执行的过程.异步就不一定有顺序,而是随机的执行.一组并发进程进行互相合作,互相等待,使得各进程按照一定的顺序执行的过程.2.system系统调用可以按照字符串方式调用系统命令.3.生产者只需要释放信号量:消费量只需要获取而不需要释放4.信号量初始值等于0,在互斥通讯中大于05.生产者:(1)创建信号量集合的键值(ftok函数)(2)创建信号量(semget函数)(3)设置信号量初始值为0(semctl(信号量ID,第几个信号量,什么操作[,欲设置的值])函数)(

第14课-信号互斥编程

1.产生背景:有些资源呗多个进程同时访问的时候,可能出现数据混乱的现象2.定义:信号量有名信号灯.主要是用来保护临界资源(进程互斥).进程可以根据他判定是否可以访问临界资源.还可以用于进程同步.实质:一个数字操作:获取和释放.利用信号量的值判断是否可以操作,大于0可以.0不可以.所以在创建操作之前一般要保证初始值是1.可以使用semctl函数来获取和设置初始值.3.分类:(1)二值信号量:信号灯的值只能是0和1(2)计数信号量:信号灯的值可以取任意非负值4.和文件的区别(1)打开信号量得到标识符