UNIX环境高级编程:system V信号量

1. 信号量(semaphore)主要用于保护临界资源。

进程可以根据它判断是否能访问某些共享资源。

信号量除了用于访问控制外,还可用于进程同步,也就是进程间通信。

2. 信号量分类:

a. 二值信号量: 信号量的值只能取0或1,类似于互斥锁mutex,但两者又不同:

mutex 与 二值信号量的区别:

信号量强调共享资源,只要共享资源可用,其他进程同样可以修改信号量的值;

互斥锁更强调进程,占用资源的进程使用完资源后,必须由进程本身来接锁。

b. 计数信号量:信号量的值可以取任意非负值。

system V信号量通过定义如下概念给信号量增加了另外一级复杂度。

计数信号量集:一个或多个信号量(构成一个集合),其中每个都是计数信号量。每个集合的信号量数存在一个限制,一般在25个数量级。

3.semget函数(信号量的创建)

semget函数创建一个信号量集或访问一个已存在的信号量集。

#include <sys/sem.h>
int senget(key_t key,int nsems,int oflag);

nsems参数指定集合中的信号量数。如果我们不创建一个新的信号量集,而只是访问一个已存在的集合,那就可以把该参数指定为0。一旦创建完一个信号量集,我们就不能改变其中的信号量数。

oflag值是SEM_R和SEM_A常值得组合。他们还可以与IPC _CREAT或IPC_CREAT | IPC_EXCL按位或。

当实际操作为创建一个新的信号量集时,相应的semid_ds结构的以下成员将被初始化。

(1)sem_perm结构的uid和cuid成员被置为调用进程的有效用户ID,gid和cgid成员被置为调用进程的有效组ID。

(2)oflag参数中的读写权限位存入sem_perm.mode。

(3)sem_otime被置为0,sem_ctime则被置为当前时间。

(4)sem_nsems被置为nsems参数的值。

(5)与该集合中每个信号量关联的各个sem结构并不初始化。这些结构时在以SET_VAL或SETALL命令调用semctl时初始化的。

4.semop函数(操作信号量)

使用semget打开一个信号量集后,对其中一个或多个信号量的操作就使用semop函数来执行。

#include <sys/sem.h>
int semop(int semid,struct sembuf *opsptr,size_t nops);

其中opsptr指向一个如下结构的数组:

struct sembuf{
           unsigned short sem_num;  /* semaphore number */
           short          sem_op;   /* semaphore operation */
           short          sem_flg;  /* operation flags */
};

假定有一个信号量变量sv,

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

V(sv):用于发送信号,如果有其他进程因等待sv而挂起,就让它恢复运行,如果没有进程因等待sv而被挂起,就给它加1

semaphore sv=1;

loop forever{

P(sv);

critical code section;

V(sv);

noncritical code section;

}

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/OS/unix/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索结构
, 函数
, 进程
, sem
, 信号量
, semctl
, semaphore
, 二值化
, 一个
semop
system v信号量、信号量 p v、linux信号量与p v操作、信号量、c 信号量,以便于您获取更多的相关知识。

时间: 2024-12-24 20:55:12

UNIX环境高级编程:system V信号量的相关文章

UNIX环境高级编程中的apue.h

/************** * *apueerror.h * *************/ #include <apue.h> #include <stdio.h> #include <errno.h> /* for definition of errno */ #include <stdarg.h> /* ISO C variable aruments */ static void err_doit(int, int, const char *, va

unix高级编程-UNIX环境高级编程 times() 疑问

问题描述 UNIX环境高级编程 times() 疑问 例程 int main(int argc, char *argv[]) { clock_t s_clk,e_clk; struct tms s_tms,e_tms; s_clk = times(&s_tms); system("ls /dev"); system("date"); sleep(1); e_clk = times(&e_tms); printf("e_clk %ld - s

ubuntu-最近在学习Unix 环境高级编程,配置环境时遇到了些问题

问题描述 最近在学习Unix 环境高级编程,配置环境时遇到了些问题 最近再看APUE(UNix 环境高级编程)的第三版,照着教程在中配置环境.也就是想要运行书中的源码,则要安装 libbsd-dev包,而每次安装这个包时,都如上报错,请问各位大虾,该怎么解决呢? 解决方案 你好, 类似的问题我也遇到过 ubuntu下apt-get install安装软件, 报"无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系",今天终于找到解决方法了. 一般出现这种情况的原

unix环境高级编程-UNIX环境高级编程源代码对应

问题描述 UNIX环境高级编程源代码对应 今天开始学习UNIX环境高级编程,书中的源代码下载到了,但是发现根本不是按章节来的,找起来是相当的费时间,有哪位大神用过后知道他们的对应关系么,比如1-1对应ls1.c这样,真是万分感激,造福大家啊!

Mac OS X 10.8 中编译APUE(Unix环境高级编程)的源代码过程_C 语言

最近在温习APUE(<unix环境高级编程>),以前都是在linux下搞,现在打算在自己机器弄下,于是google了下,把编译的事情搞定了,修改了一些教程的一些错误,比如下载链接之类的. 1.下载源文件,我这里是第二版,貌似第三版的英文版出来了... 复制代码 代码如下: wget http://www.apuebook.com/src.2e.tar.gz 2.解压 复制代码 代码如下: tar zxf src.2e.tar.gz 3.修改些东西 复制代码 代码如下: cd apue.2e/

UNIX环境高级编程---标准I/O库

前言:我想大家学习C语言接触过的第一个函数应该是printf,但是我们真正理解它了吗?最近看Linux以及网络编程这块,我觉得I/O这块很难理解.以前从来没认识到Unix I/O和C标准库I/O函数压根不是一码事.Unix I/O也叫低级I/O,也叫Unbuffered I/O,是操作系统内核部分,也是系统调用:而C标准I/O函数相对也成Buffered I/O,高级I/O,一般是为了效率考虑对这些系统调用的封装.以前使用getchar()经常为输入完后的回车而出错.那是不理解标准I/O实现时的

UNIX环境高级编程:system V消息队列

unix早期通信机制中的信号能够传送的信息量有限,管道则只能传送无格式字节流,这远远是不够的. 消息队列(也叫报文队列)客服了这些缺点: 消息队列就是一个消息的链表. 可以把消息看作一个记录,具有特定的格式. 进程可以按照一定的规则向消息队列中添加新消息:另一些进程可以从消息队列中读走消息. 消息队列是随内核持续的,只有内核重启或人工删除时,该消息队列才会被删除. system V消息队列使用消息队列标识符标识.具有足够特权的任何进程都可以往一个给定队列放置一个消息,具有足够特权的任何进程都可以

《UNIX环境高级编程(第3版)》——2.2 UNIX标准化

2.2 UNIX标准化 2.2.1 ISO C 1989年下半年,C程序设计语言的ANSI标准X3.159-1989得到批准.此标准被也采纳为国际标准ISO/IEC 9899:1990.ANSI是美国国家标准学会(American National Standards Institute)的缩写,它是国际标准化组织(International Organization for Standardization,ISO)中代表美国的成员.IEC是国际电子技术委员会(International Ele

《UNIX环境高级编程(第3版)》——2.3 UNIX系统实现

2.3 UNIX系统实现 上一节说明了3个由各自独立的组织所制定的标准:ISO C.IEEE POSIX以及Single UNIX Specification.但是,标准只是接口的规范.这些标准是如何与现实世界相关连的呢?这些标准由厂商采用,然后转变成具体实现.本书中我们不仅对这些标准感兴趣,还对它们的具体实现感兴趣. 在McKusick等[1996]的1.1节中给出了UNIX系统家族树的详细历史.UNIX的各种版本和变体都起源于在PDP-11系统上运行的UNIX分时系统第6版(1976年)和第