1 概述

计数信号量集semid_ds:

struct semid_ds
{
struct ipc_perm sem_perm;
struct sem *sem_base; //指向信号量结构数组
unsigned short sem_nsems; //信号量集中信号量数目
time_t sem_otime; //last semop时间
time_t sem_ctime;
};

sem结构是内核用于维护某个给定信号量的内部数据结构:

struct sem
{
unsigned short semval; //信号量值
pid_t sempid;
unsigned short semncnt; //等待信号量值增长到某个值的进程数
unsigned short semzcnt; //等待信号量值为0的进程数
};

2 semget函数

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

key为IPC_PRIVATE或未与某个IPC对象相关联其oflag中指定IPC_CREAT,则创建信号量集
信号量集中信号量值并不进行初始化,需要通过SETVAL或SETALL命令调用semctl函数进行初始化

3 semop函数

semop函数对信号量集进行操作,增加或减小信号量值,对应释放与分配资源

int semop(int semid,struct sembuf *opsptr,size_t nops)

sembuf是针对信号集中的某个信号进行指定操作的结构,semop函数在信号集semid上进行nops个信号操作

struct sembuf
{
short sem_num;
short sem_op;
short sem_flg;
};

sem_num:指定信号集中进行操作的信号

sem_op:大于0:进程释放sem_num信号量关联的资源,释放资源数为sem_op,将sem_op加到信号值中,同时从信号量调整值中减去sem_op

小于0:进程希望获取sem_num信号量关联的资源,占用数为|sem_op|,根据semval的值和sem_flg决定阻塞还是返回

等于0:进程希望等待信号量值变成0

sem_flg:IPC_NOWAIT:非阻塞

IPC_UNDO:是否开启信号量调整(占用资源的进程因临时终止没能调整信号量值的情况是存在的,为了避免,在分配或释放资源时,用信号量调整值记录进程占用的资源)

4 semctl函数

int semctl(int semid,int semnum,int cmd,/* union semun arg */)

semctl函数中cmt命令分为三种:针对信号量集本身,针对某个信号量,针对所有信号量

因此定义共用体semun,针对不同的cmd,对semun有不同的使用:

union semun
{
int val; //SETVAL
struct semid_ds *buf; //IPC_STAT,IPC_SET
unsigned short *array; //SETALL,GETALL
};

针对信号量集:

IPC_STAT:取信号量集信息存于semun.buf中

IPC_SET:根据semun.buf设置信号量集的sem_perm.uid,sem_perm.gid

IPC_RMID:删除信号量集

针对特定信号量semnum:

GETVAL:返回信号量semval

SETVAL:根据semun.val设置信号量值

GETPID:返回信号量的sempid

GETNCNT:返回信号量的semncnt

GETZCNT:返回信号量的semzcnt

针对所有信号量:

GETALL:写所有信号量值到semun.array

SETALL:根据semun.array各元素值设置所有信号量值

System V 信号量的更多相关文章

  1. 第11章 System V 信号量

    11.1 概述 信号量按功能分:二值信号量.计数信号量.信号量集:其中二值信号量和计数信号量指的是Posix信号量,信号量集指的是System V信号量.

  2. System V信号量

    信号量对比 二值信号量:其值要么0要么1,比如互斥锁就是这种类型 计数信号量:其值为0或某个正整数,比如POSIX 信号量 计数信号量:一个或多个信号量构成一个集合,每个都是计数信号量,比如Syste ...

  3. UNIX环境高级编程——system V信号量

    1. 信号量(semaphore)主要用于保护临界资源.进程可以根据它判断是否能访问某些共享资源.信号量除了用于访问控制外,还可用于进程同步,也就是进程间通信.2. 信号量分类:a. 二值信号量: 信 ...

  4. Linux IPC实践(11) --System V信号量(1)

    信号量API #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semget ...

  5. System V 信号量使用相关函数

    System V 信号量 在提到Posix 信号量时,指的是二值信号量或计数信号量,而System V信号量指的是入了计数信号量集 二值信号量:其值为0或1,类似于互斥锁,资源被锁住时为0,资源可用为 ...

  6. linux网络编程之system v信号量(二)

    今天迎来元旦假期的最后一天了,过得好快~昨天跟小伙伴们在军都滑雪陪儿爽,虽说上了两回中级道都摔得异常的惨烈,但是在初级道上学习"s"转弯还是有一些小心得,可以在要往高手迈进的前提, ...

  7. linux网络编程之system v信号量(一)

    今天起,学习信号量相关的知识,下面开始: 关于信号量,在前面已经介绍过了,这里回顾一下: 通过上面的描述,很容易就能想到信号量的一上数据结构: 下面再来回顾一下P.V原语: 所谓的原语就是指这段代码是 ...

  8. Linux中的System V信号量

    在进程同步,并发运行时,保证按序地访问共享资源是十分重要的.因此引入了临界区的概念,一次只能有一个线程进入临界区完成他的指令.而信号量(semaphore)的作用,类似于一个交通信号灯,它负责进程协作 ...

  9. system V信号量和Posix信号量

    一.函数上的区别 信号量有两种实现:传统的System V信号量和新的POSIX信号量.它们所提供的函数很容易被区分:对于所有System V信号量函数,在它们的名字里面没有下划线.例如,应该是sem ...

  10. Linux IPC System V 信号量

    模型 #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> ftok() //获取key ...

随机推荐

  1. POJ3356 – AGTC(区间DP&&编辑距离)

    题目大意 给定字符串X和Y,可以对字符串进行一下三种操作: 1.删除一个字符 2.插入一个字符 3.替换一个字符 每个操作代价是1,问运用以上三种操作把X变为Y所需的最小步数是多少? 题解 定义dp[ ...

  2. Linux内存寻址之分页机制

    在上一篇文章Linux内存寻址之分段机制中,我们了解逻辑地址通过分段机制转换为线性地址的过程.下面,我们就来看看更加重要和复杂的分页机制. 分页机制在段机制之后进行,以完成线性—物理地址的转换过程.段 ...

  3. &lt;Android&gt;从窗口泄漏谈android:configChanges属性

    今天有幸去哥们的大公司做了半天的暂时工,一个偶现的Bug折腾了他好久,好不easy今天抓到了异常Log日志.大致的意思就是android.view.windowleaked--窗口泄漏.我在网上查了资 ...

  4. Solr学习笔记-在Tomcat上部署执行Solr

    上一篇我们初识了Solr而且学习了Jetty的启动方式.查看了Solr的管理界面,这一篇我们来实如今Tomcat上部署执行Solr. 部署环境: window7 jdk1.6.0_14 Solr-4. ...

  5. CCLabelAtlas创建自定义字体

    有时候游戏中要用到一些特殊的字体效果,特别是数字. CCLabelAtlas就可以从png图中读取文字. CCLabelAtlas* diceCount=CCLabelAtlas::labelWith ...

  6. bash shell for循环1到100 .

    前言 用bash shell写程序时,经常会用到for循环,特别是从1到100这种需求,这里记录几种shell中从1到100的循环方法   方法 类c语言 for ((i=1; i<=100;  ...

  7. UISenior之数据的本地化持久化

    数据的本地化主要分为两个方面:1.简单数据的本地持久化(NSString.NSArray.NSDictionary.NSData)2.复杂数据的本地持久化(本文以Person类为例) 简单对象的本地化 ...

  8. kickstart安装

    1.生成ks.cfg 文件 安装Kickstart # yum install system-config-kickstart 8.2 在桌面环境下配置Kickstart 启动X Windows 环境 ...

  9. FxCop

    下载地址:http://www.microsoft.com/en-us/download/details.aspx?id=8279 FxCop是一个代码分析工具,和StyleCop(代码规范)一起配合 ...

  10. Fetch的使用

    import React,{ Component } from 'react'; import { AppRegistry, ListView, Image, Text, StyleSheet, Vi ...