自测之Lesson12:信号量
题目:创建一个包含5个信号量的信号集。
完成代码:
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <string.h> #define SEM_NUM 5 // 信号量的个数 // 创建一个信号集
int main()
{
key_t key;
key = ftok("test", 1); // 创建key
if (key == -1) {
perror("fail ftok");
return -1;
}
int semid;
semid = semget(key, 5, IPC_CREAT | 0664); // 创建一个包含5个信号量的信号集
if (semid == -1) {
perror ("fail semget");
return -1;
}
printf("semid: %d\n", semid);
return 0;
}
题目:编写一个程序,要求:实现信号量的P、V、Z操作。
完成代码:
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <string.h>
#include <stdlib.h> #define SEM_NUM 5 void initSemaphore(int semid)
{
unsigned short semInit[SEM_NUM];
printf("init [%d] semaphore: ", SEM_NUM);
int i;
for (i = 0; i != SEM_NUM; i++) {
int n;
scanf("%d", &n);
semInit[i] = n;
}
semctl(semid, SEM_NUM, SETALL, semInit);
} void semop_PVZ(int semid, char flag)
{
struct sembuf sops[SEM_NUM];
int arr[SEM_NUM];
int isign = 1;
switch(flag) {
case 'p':
isign = -1;
break;
case 'v':
isign = 1;
break;
case 'z':
isign = 0;
break;
case 'i':
initSemaphore(semid);
return;
default:
return;
}
setbuf(stdout, NULL);
while(1) {
printf("[%c]:", flag);
scanf ("%d%d%d%d%d", arr, arr + 1, arr + 2, arr + 3, arr + 4);
int i = 0;
int cnt = 0;
for (i = 0; i != SEM_NUM; i++) {
if (arr[i] == 0) {
continue;
}
sops[cnt].sem_num = i;
sops[cnt].sem_op = arr[i] * isign;
sops[cnt].sem_flg = 0;
cnt++;
}
int iRet;
iRet = semop(semid, sops, cnt);
if (iRet == -1) {
perror("fail semop");
return;
}
} } int main(int argc, char **argv)
{
if (argc != 2 ||
(strcmp(argv[1], "p") && strcmp(argv[1], "v")
&& strcmp(argv[1], "q") &&strcmp(argv[1], "z")
&& strcmp(argv[1], "i")))
{
printf("Usage: %s [ p | v | q | z | i ]\n", argv[0]);
printf("\tp: p operator\n");
printf("\tv: v operator\n");
printf("\tq: query semaphore value\n");
printf("\tz: z operator\n"); // z操作既不释放资源,也不申请资源,只做一个判断和等待信号量变为0
printf("\ti: init semaphore\n");
return -1;
}
key_t key;
key = ftok("a", 1);
if (key == -1) {
perror("fail ftok");
return -1;
}
int semid;
semid = semget(key, SEM_NUM, IPC_CREAT | 0664);
if (semid == -1) {
perror("fail semget");
return -1;
}
// 查询信号集内的各个信号量的值
if (argv[1][0] == 'q') {
unsigned short array[SEM_NUM]; // 存放信号量的值
int i;
semctl(semid, SEM_NUM, GETALL, array);
printf("semaphore value:");
for (i = 0; i < SEM_NUM; i++) {
printf(" %d", array[i]);
}
printf("\n");
}
else {
semop_PVZ(semid, argv[1][0]);
}
return 0;
}
题目:
自测之Lesson12:信号量的更多相关文章
- linux POSIX 信号量介绍
信号量一.什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)使用.多线程可以同时运行多个线程函数完成功能,但是对于共享数据如果不加以锁定,随意改变共享数据的值会发生 ...
- 多进程之间的互斥信号量实现(Linux和windows跨平台)
多线程之间实现互斥操作方式很多种,临界区(Critical Section),互斥量(Mutex),信号量(Semaphore),事件(Event)等方式 其中临界区,互斥量,信号量算是严格意义的实现 ...
- 性能测试Jmeter压测ZooKeeper-自定义java请求
要想通过自定义java请求来压测ZooKeeper,那么我们就需要做两件事情,第一我们需要知道java如何操作ZooKeeper,第二就是怎么能将我们写的jar包让jmeter识别,首先我们先来干第 ...
- 互联网进行限流策略的Semaphore信号量使用
在Semaphore信号量非常适合高并发访问,新系统在上线之前,要对系统的访问量进行评估,当然这个值肯定不是随便拍拍脑袋就能想出来的,是经过以往的经验.数据.历年的访问量,已经推广力度进行一个合理的评 ...
- 一次信号量引发的tomcat异常退出
近期在玩大数据.有个朋友找过来,说他线上的tomcat会莫名其妙的退出,表示非常苦恼,请我帮看看.每次他发现退出了,都通过腾讯云的WEB控制台登录,启动tomcat. 本着助人为乐(shao kao ...
- mysql每秒最多能插入多少条数据 ? 死磕性能压测
前段时间搞优化,最后瓶颈发现都在数据库单点上. 问DBA,给我的写入答案是在1W(机械硬盘)左右. 联想起前几天infoQ上一篇文章说他们最好的硬件写入速度在2W后也无法提高(SSD硬盘) 但这东西感 ...
- 强强联合,Testin云测&云层天咨众测学院开课了!
Testin&云层天咨众测学院开课了! 共享经济时代,测试如何赶上大潮,利用碎片时间给女票或者自己赚点化妆品钱? 2016年12月13日,Testin联手云层天咨带领大家一起推开众测的大门 ...
- nginx代理https站点(亲测)
nginx代理https站点(亲测) 首先,我相信大家已经搞定了nginx正常代理http站点的方法,下面重点介绍代理https站点的配置方法,以及注意事项,因为目前大部分站点有转换https的需要所 ...
- 【腾讯优测干货分享】安卓专项测试之GPU测试探索
本文来自于Dev Club 开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57c7ffdc0569a1191bce8a63 作者:章未哲——腾讯SNG质 ...
随机推荐
- Mybartis逆向工程
Mybartis逆向工程 0.创建工程项目,切记莫用中文,亲测在运行时报错 1.Pom文件,使用mybatis-generator插件 <?xml version="1.0" ...
- 分布式网上商城项目-solr搜索功能错误
1.RuntimeException错误 java.lang.RuntimeException: org.apache.ibatis.binding.BindingException: Invalid ...
- js实现所有异步请求全部加载完毕后,loading效果消失
在实际开发中,一定有情况是这样的,一个页面我们有多个地方请求了ajax,在这种情况下,我们要实现数据没来之前出现我们炫酷的loading效果,而且要等到所有的ajax都请求完毕后,才让我们的loadi ...
- php的基础知识(二)
7.系统常量: 常量的定义:常量是程序运行的时候是不可以改变的量 定义格式:define(‘常量名字’,‘常量的值’): 注意: ·不能重复定义 ·常量的名字最好用大写字母. ·常量的值只能是标量. ...
- day 15 装饰器
装饰器(重点,难点) 开闭原则: 对功能的扩展开放 对代码的修改是封闭的 在目标函数前和后插入一段新的代码.不改变原来的代码 通用装饰器写法: # 存在的 ...
- ruby 字符串加密
str = 'This is a test.rb!' #DES加密 puts str.crypt('salt') #MD532位加密 require 'digest' puts Digest::MD5 ...
- 《PHP发送邮件PHPMailer》系列分享专栏
<PHP发送邮件PHPMailer>已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read/201726.html 文章 PHPMailer ...
- Log4net 配置实例
首先需要下载并引用Log4net的binary.这一步可以通过在Visual Studio里的Manage Nuget package for solution轻松添加. 第二步是配置config文件 ...
- 十分钟搭建和使用sonarqube代码质量管理平台
前言 Sonarqube为静态代码检查工具,采用B/S架构,帮助检查代码缺陷,改善代码质量,提高开发速度,通过插件形式,可以支持Java.C.C++.JavaScripe等等二十几种编程语言的代码质量 ...
- js polyfill , to developing the cross browser js
https://github.com/paulmillr/console-polyfill https://github.com/Modernizr/Modernizr/wiki/HTML5-Cros ...