题目:创建一个包含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. ABAP术语-SAP GUI for HTML

    SAP GUI for HTML 原文:http://www.cnblogs.com/qiangsheng/archive/2008/03/14/1104996.html An ITS impleme ...

  2. 关于js代码位置的第一次总结

    最近在学习dom树节点操作时,发现查找结点总是返回null,原因在于将js代码放在了head里,因为页面是从上往下逐行加载,在还未加载相关节点时当然查找不到,返回值为null. 而对于另一句老生常谈的 ...

  3. Kaggle比赛总结

    做完 Kaggle 比赛已经快五个月了,今天来总结一下,为秋招做个准备. 题目要求:根据主办方提供的超过 4 天约 2 亿次的点击数据,建立预测模型预测用户是否会在点击移动应用广告后下载应用程序. 数 ...

  4. mongodb安装 超级管理 普通用户

    安装MongoDB #1.配置mongo的yum源sudo vi /etc/yum.repos.d/mongodb-org-3.4.repo [mongodb-org-3.4]name=MongoDB ...

  5. Python递归与迭代

    1.递归与迭代: 递归和迭代都是循环的一种.简单地说,递归是重复调用函数自身实现循环.迭代是函数内某段代码实现循环,而迭代与普通循环的区别是:循环代码中参与运算的变量同时是保存结果的变量,当前保存的结 ...

  6. MySQL高级-查询截取分析

    一.如何分析 1.观察.至少跑1天,看看生产的慢SQL情况. 2.开启慢查询日志,设置阙值比如超过5秒钟的就是慢SQL,并将它抓取出来. 3.explain + 慢SQL分析 4.show profi ...

  7. redis 类型、方法

    之前使用redis,现在对所有redis方法做一个总结: string类型 形式:key=>value; 说明:最简单的类型:一个key对应一个value,value保存的类型是二进制安全的,s ...

  8. CentOS下安装Tomcat环境

    一.安装JAVA环境 1.安装JAVA mkdir -p /usr/local/java 下载jdk1.7.0_67.tar.gz包,并解压到 tar xf jdk1.7.0_67.tar.gz -C ...

  9. 获取附加在方法上的Attribute

    如下: class Program { static void Main(string[] args) { var methodInfo = typeof(Program).GetMethod(&qu ...

  10. hdu1051 Wooden Sticks(贪心+排序,逻辑)

    Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...