题目:创建一个包含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:信号量的更多相关文章

  1. linux POSIX 信号量介绍

    信号量一.什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)使用.多线程可以同时运行多个线程函数完成功能,但是对于共享数据如果不加以锁定,随意改变共享数据的值会发生 ...

  2. 多进程之间的互斥信号量实现(Linux和windows跨平台)

    多线程之间实现互斥操作方式很多种,临界区(Critical Section),互斥量(Mutex),信号量(Semaphore),事件(Event)等方式 其中临界区,互斥量,信号量算是严格意义的实现 ...

  3. 性能测试Jmeter压测ZooKeeper-自定义java请求

     要想通过自定义java请求来压测ZooKeeper,那么我们就需要做两件事情,第一我们需要知道java如何操作ZooKeeper,第二就是怎么能将我们写的jar包让jmeter识别,首先我们先来干第 ...

  4. 互联网进行限流策略的Semaphore信号量使用

    在Semaphore信号量非常适合高并发访问,新系统在上线之前,要对系统的访问量进行评估,当然这个值肯定不是随便拍拍脑袋就能想出来的,是经过以往的经验.数据.历年的访问量,已经推广力度进行一个合理的评 ...

  5. 一次信号量引发的tomcat异常退出

    近期在玩大数据.有个朋友找过来,说他线上的tomcat会莫名其妙的退出,表示非常苦恼,请我帮看看.每次他发现退出了,都通过腾讯云的WEB控制台登录,启动tomcat. 本着助人为乐(shao kao ...

  6. mysql每秒最多能插入多少条数据 ? 死磕性能压测

    前段时间搞优化,最后瓶颈发现都在数据库单点上. 问DBA,给我的写入答案是在1W(机械硬盘)左右. 联想起前几天infoQ上一篇文章说他们最好的硬件写入速度在2W后也无法提高(SSD硬盘) 但这东西感 ...

  7. 强强联合,Testin云测&云层天咨众测学院开课了!

    Testin&云层天咨众测学院开课了! 共享经济时代,测试如何赶上大潮,利用碎片时间给女票或者自己赚点化妆品钱?   2016年12月13日,Testin联手云层天咨带领大家一起推开众测的大门 ...

  8. nginx代理https站点(亲测)

    nginx代理https站点(亲测) 首先,我相信大家已经搞定了nginx正常代理http站点的方法,下面重点介绍代理https站点的配置方法,以及注意事项,因为目前大部分站点有转换https的需要所 ...

  9. 【腾讯优测干货分享】安卓专项测试之GPU测试探索

    本文来自于Dev Club 开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57c7ffdc0569a1191bce8a63 作者:章未哲——腾讯SNG质 ...

随机推荐

  1. About Me - 关于

    0x00 简介 97年生 计算机相关专业,无线电安全攻防方向. 涉猎较多,喜欢研究无线.硬件.软件.网络.攻击.检测.防御等各类安全技术 精通较少,主要擅长的还是硬件.渗透.无线攻击方面. 现阶段在研 ...

  2. CF1066A Vova and Train(模拟)

    大水题... 题目要求你求能看到的灯笼数,我们可以分为3部分 总共的灯笼数——————1 在 l 左面的灯笼数(不包括lll)——————2 在 r 左面的灯笼数(包括rrr)——————3 我们知道 ...

  3. Struts2+Spring+Hibernate整合开发(Maven多模块搭建)

    Struts2+Spring+Hibernate整合开发(Maven多模块搭建) 0.项目结构 Struts2:web层 Spring:对象的容器 Hibernate:数据库持久化操作 1.父模块导入 ...

  4. MySQL常用参数说明(持续更新)

      ##innodb correlate   innodb_flush_log_at_trx_commit value: 0,[1],2 effect: control the flush opera ...

  5. jQuery 常用核心方法

    jQuery 常用核心方法 .each() 遍历一个jQuery对象,为每个匹配元素执行一个函数 $('p').each(function(idx,node){ $(node).text(idx + ...

  6. Spring Security学习笔记(一)

    认证和权限控制 AuthenticationManager是认证的主要接口,它只有一个authenticate方法,可以做3件事情. 返回一个认证信息(Authentication),表示认证成功 抛 ...

  7. 第2天 Java基础语法

    第2天 Java基础语法 今日内容介绍 变量 运算符 变量 变量概述 前面我们已经学习了常量,接下来我们要学习变量.在Java中变量的应用比常量的应用要多很多.所以变量也是尤为重要的知识点! 什么是变 ...

  8. 【数据结构】线性表&&顺序表详解和代码实例

    喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 01 预备知识 1.0 什么是线性表? 线性表(List)是零个或者多个数据元素的有限序列. 首先它是一个序列.里面的元素是有顺 ...

  9. 为什么我要放弃javaScript数据结构与算法(第九章)—— 图

    本章中,将学习另外一种非线性数据结构--图.这是学习的最后一种数据结构,后面将学习排序和搜索算法. 第九章 图 图的相关术语 图是网络结构的抽象模型.图是一组由边连接的节点(或顶点).学习图是重要的, ...

  10. 笔记-jinja2语法

    笔记-jinja2语法 1.      基本语法 控制结构 {% %} 变量取值 {{ }} 注释 {# #} 2.      变量 最常用的是变量,由Flask渲染模板时传过来,比如上例中的”nam ...