题目:创建一个包含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. json提取嵌套数据

    //数据 string html = "{\"code\":\"0000\",\"desc\":\"\",\& ...

  2. tomcat安装、配置相关的几个点

    Connector port="8080"HTTP协议的默认端口号:8080 FTP协议的默认端口号:21 1.tomcat的安装目录要与Java jre的安装目录一致. bin: ...

  3. PHP批量清理MIP-cache缓存(内附在线mipcache清理工具)

    MIP是什么?我就不多说了把. MIPCache 又是什么? 科普一下:MIPCache 是一套基于代理的 CDN 缓存系统.可用于缓存所有被某度相关页面引用或者从百度相关服务点出的 MIP 页面.当 ...

  4. 自添加LUCI菜单及编译为ipk

    目录 添加汉化编译为ipk配置文件入口函数界面文件Makefile 添加 添加自己的luci界面,有3个必要的要素: a配置文件.新建一个在/etc/config/abcdefg b入口函数.新建一个 ...

  5. 利用谷歌翻译网站和Adobe Acrobat翻译英文文档,且鼠标放置后显示英文原文(无字数限制)(18/12/11更新)

    软件:Adobe Acrobat 网页:https://translate.google.cn/?tr=f&hl=zh-CN 方法:       第一步:用Adobe Acrobat 打开英文 ...

  6. 洛谷P4526 【模板】自适应辛普森法2(simpson积分)

    题目描述 计算积分 保留至小数点后5位.若积分发散,请输出"orz". 输入输出格式 输入格式: 一行,包含一个实数,为a的值 输出格式: 一行,积分值或orz 输入输出样例 输入 ...

  7. POJ2505 A multiplication game(博弈)

    题意 开始时$p = 1$,每次可以乘$2 - 9$,第一个使得$p \geqslant n$的人赢 问先手是否必胜 $1 <n <4294967295$ Sol 认真的推理一波. 若当前 ...

  8. 跨平台编译Go程序(交叉编译)

    作用:比如你手头只有Mac系统,而你的用户有Linux和Windows的,他们也想用,你可以通过交叉编译出Linux和Windows上的可执行文件给他们用 (1)首先进入go/src 源码所在目录,执 ...

  9. 第十五届北京师范大学程序设计竞赛现场决赛题解&源码(A.思维,C,模拟,水,坑,E,几何,思维,K,字符串处理)

    #include <bits/stdc++.h> using namespace std; int main() { int T,n,a,b; while(cin>>T) { ...

  10. 180606-Linux下jdk中文乱码问题解决

    文章链接:https://liuyueyi.github.io/hexblog/2018/06/06/180606-Linux下jdk中文乱码问题解决/ linux下jdk中文乱码问题解决 之前遇到过 ...