system-V的信号量其实是一个信号量数据,一个sysyem-V代表的是一个或多个信号量元素

信号量本质上是一个数字,用来表征一种资源数量,当多个进程或线程争夺这些稀缺资源的时候,信号量用来保证他们合理地、秩序地使用这些资源。

信号量SEM,不是用来传输数据的,而是作为“旗语”,用来协调个进程或者而线程工作的。

1信号量分类

  1. ststem-V信号量
  2. POSIX有名信号量
  3. POSIX无名信号量

2一些基本概念

  1. 临界资源:也叫共享资源,多个进程或线程有可能同时访问的资源(变量、链表、文件等等)
  2. 临界区:访问这些资源的代码成为临界代码,这些代码区域区域称为临界区
  3. P操作:程序进入临界区之前之前必须要对资源进行申请,这个动作被称为P操作,简单来说就是申请资源
  4. V操作:程序离开临界区之后必须要释放响应的资源,这个动作被称为V操作,简单来说就是释放资源

3核心API

相同的头文件

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

3.1创建SEM

功能:获取信号量ID

int semget(key_t key,int nsems,int semflg);

参数:

  • 返回值:

    • 成功:信号量ID
    • 失败:-1
  • key:信号量的键值
  • nsems:信号量元素的个数
  • semflg:创建选项
    • IPC_CREAT:如果key对应的信号量不存在,则创建
    • IPC_EXCL:如果key对应的信号量存在,则报错
    • mode:信号量的访问权限

创建信号量时,还受到一下系统信息的影响

  1. SEMMNI:系统中信号量的总数最大值
  2. SEMMSL:每个信号量中信号量元素的个数最大值
  3. SEMMNS:系统中素有信号量中的信号量元素的总数最大值

实例代码:

int main(void)
{ key_t key = ftok(".",1); int semid = semget(key,2,IPC_CREATE|0666);
}

3.2PV操作

功能:对信号量进行PV操作,或者等零操作

int semop(int semid,struct sembuf sops[],unsigned nsops);

参数:

  • 返回值:

    • 成功:0
    • 失败:-1
  • semid:信号量ID
  • sops:信号量操作结构体数组
  • nsops结果体数组元素个数
  1. 信号量操作结构体
struct sembuf { unsigned short sem_num;//信号量元素序号     short sem_op;//操作参数 short sem_flg;//操作选项
}
  1. 根据sem_op的值,信号量操作分为3中情况:

    1. sem_op>0:V操作
    2. sem_op=0:等零操作
    3. sem_op

示例代码

int main() { key_t key = ftok(".", 1); // 创建(若已有则打开)一个包含2个元素的信号量组 int id = semget(key, 2, IPC_CREAT|0666); // 定义包含两个P/V操作的结构体数组 struct sembuf op[2]; op[0].sem_num = 0; // 信号量元素序号 op[0].sem_op = -2; // P操作 op[0].sem_num = 0; // 选项默认0 op[1].sem_num = 1; // 信号量元素序号 op[1].sem_op = +3; // V操作 op[1].sem_num = 0; // 选项默认0 // 同时对第0、1号信号量元素分别进行P、V操作 semop(id, op, 2);
}

3.3 获取或设置信号量的相关属性

int semctl(int semid,int semnum,int cmd....)

参数:

  • semid:信号量ID
  • semnum:信号量元素序号
  • cmd
    • IPC_STAT:获取属性信息
    • IPC_SET:设置属性信息
    • IPC_RMID:立即删除该信号量,参数semnum将被忽略
    • IPC_INFO:获得关于信号量的系统限制信息
    • SEM_INFO:获得系统为共享内存消耗的资源信息
    • SEM_STAT:获得系统中所有SEM的相关信息
    • GETALL:返回所有信号量元素的值,参数semnum将被忽略
    • GETNCNT:返回正阻塞在对该吸纳后量元素P操作的进程总数
    • GETPID:返回最后一个队该信号量元素操作的进程PID
    • GETVAL:返回该信号量元素的值
    • GETZCNT:返回正阻塞对该信号量元素等零操作的进程总数
    • SETALL:返回所有信号量元素的值,参数semnum将被忽略
    • SETVAL:设置该信号量元素的值
  • 返回值
    • GETNCNT:semncnt
    • GETPID:sempid
    • GETVAL:semval
    • GETZCNT:semzcnt
    • IPC_INFO:内核中记录所有SEM信息的数组的下标最大值
    • SEM_INFO:同IPC_INFO
    • SEM_STAT:内核中看i路所有SEM信息的数组
    • 失败:-1
  1. 这是一个变参函数,根据cmd的不同,可能需要第四个参数,第四个参数是一个如下所示的联合体,用户需要自己定义
union semun { int val;//当cmd为SERVAL时使用 struct semid_ds *buf;//当cmd为IPC_STAT或IPC_SET时使用 unsigned short *array;//当cmd为GETALL或SETALL时使用 struct seminfo *_buf;//当cmd为IPC_INFO时使用
}
  1. 当cmd为IPC_STAT或IPC_SET时,需要用到一下属性信息结构体
struct semid_ds { struct ipc_perm sem_perm;//权限相关信息 time_t sem_otime;//最后一次semop()的信息 tien_t sem_ctime;//最后一次状态改变时间 unsigned short sem_nsems;//信号量元素个数
}

C语言-进程——信号量相关推荐

  1. 易语言进程通信c语言,易语言进程通信模块和例程源码

    易语言进程通信模块和例程源码系统结构:收到信息,收到信息,接收端_开始监听,接收端_读数据,接收端_取出数据,发送端_发送数据,取得窗口句柄,SetWindowLong,CallWindowProc2 ...

  2. C语言进程(第三章,exec函数族,execl,execlp,execle,execv,execvp,execve)

    C语言进程(第三章,exec函数族,execl,execlp,execle,execv,execvp,execve) 简介 本文讲解C语言进程中的exec函数族相关知识,相关函数有excel,exec ...

  3. c语言进程创建、等待和退出

    c语言进程创建.等待和退出 创建进程 fork()函数:函数返回值类型为pid_t 若程序运行在父进程中,函数返回的PID为子进程今年称号: 弱运行在子进程中返回PID为0. #include < ...

  4. C语言中信号量的使用

    在操作系统理论课上,其实讲授了信号量的原理和使用方式以及使用信号量的优点.相信看到这篇文章的人已经对信号量底层实现机制有了一定的了解,这里就不再过多赘述.本文主要以两个题目为例来讲授信号量如何在高级语 ...

  5. C语言使用信号量解决生产者消费者模型的同步问题

    友链 gcc 1.c -o 1 -lpthread // ..使用内存映射可以拷贝文件 /* 对原始文件进行内存映射 创建一个新文件 把新文件的数据拷贝映射到内存中 通过内存拷贝将第一个文件的内存映射 ...

  6. C语言进程——进程间的通信方式

    进程间通信就是在不同进程之间传播或交换信息,进程的用户空间是相互独立的,一般而言是不可以互相访问(除共享内存区外),系统空间却是"公众场所",通过通信方法:管道(pipe)(有名管 ...

  7. c语言进程控制实验报告,操作系统进程的创建与控制实验报告.doc

    操作系统实验报告 实验一 进程的创建和控制 班 级: 12计算机12班 学 号: 127401219 姓 名: 刘艳仙 成 绩: 2013年 实验目的 1.掌握进程的概念,明确进程的含义 2.复习C语 ...

  8. 实验一 进程同步与互斥c语言,进程互斥与进程同步实验

    第三章 同步.通信和死锁 实验一:进程互斥与进程同步 进程的互斥和同步是操作系统课程的重要内容,本实验设计算法实现临界区的互斥进入以及进程的同步. 注意:因为进程的管理的权限属于操作系统,用户没有权利 ...

  9. python3网络编程中semaphore用法_python3 进程信号量semaphore

    #-*- coding: utf-8 -*- importosimporttimefrom multiprocessing importPooldefgo_ktv(i):print("use ...

最新文章

  1. Nginx 常用配置清单
  2. 【 FPGA 】时钟偏斜及其影响
  3. 简约设计中的规律—色彩(二)
  4. MOSS 权限管理总结
  5. DF学数据结构系列——B树(B-树和B+树)介绍
  6. 福州大学软件工程1816 | W班 第7次作业成绩排名
  7. 实时数据处理插件开发flume+kafka+storm:flume
  8. 深入探索 Java 热部署
  9. mysql如何实现逻辑自增_每日一面 - mysql 的自增 id 的实现逻辑是什么样子的?
  10. iphone短信尚未送达_iPhone开启这个功能,从此告别垃圾短信骚扰!
  11. 【华为云技术分享】ARM体系结构基础(2)
  12. hadoop 依赖式job_每天一学:一个轻量级分布式任务调度框架 XXL-JOB
  13. SpringCloudSpringBootmybatis分布式微服务云架构-hystrix参数详解
  14. 如何使用Airdrop将视频从Mac发送到iPhone?
  15. 使用allegro画PCB的基本流程:
  16. hp笔记本如何看序列号
  17. Java 合并Word文档
  18. 模糊提取器(Fuzzy Extractor)
  19. 「武汉理工大学 软件工程复习」第三章 | 软件需求
  20. SSL-ZYC 2133 腾讯大战360

热门文章

  1. 计算二分类的特异性和灵敏度
  2. uni-app H5打包上线流程
  3. BZOJ3238 后缀自动机+推公式
  4. java图片式验证码的实现(引入hutool工具类和自己编写工具类两种方法)
  5. 俄勒冈健康与科学大学计算机,俄勒冈健康与科学大学费用
  6. 希尔伯特(hilbert)矩阵与最小二乘法
  7. 如何运用Knald烘焙纹理来快速呈现材质纹理细节!
  8. GAMES101作业1-VS2019
  9. centos7安装xterm_CentOS 7使用x-manager中Xstart最新工具报缺少xterm包错误
  10. 前端生成唯一id UUID