题目:创建一个包含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;
}

  

题目:

最新文章

  1. 使用UIBezierPath绘制图形
  2. 把《c++ primer》读薄(3-1 标准库string类型初探)
  3. 数据库Date类型和JavaDate类型的转换
  4. iOS 远程推送通知
  5. UNTIY3D接入91SDK的办法
  6. Shell 编程基础之 For 练习
  7. Hadoop2.3+Hive0.12集群部署
  8. Critical Rendering Path
  9. oracle 表空管理方式(LMT)、ASSM段管理方式、一级位图块、二级位图块、三级位图块。
  10. C#学习第三天
  11. ajax+FormData+javascript 实现无刷新表单注册
  12. jQuery 幻灯片 ----摘录
  13. FFmpeg资料来源简单分析:libswscale的sws_getContext()
  14. Oracle 11g 环境,使用utl_smtp创建一个存储过程来发送邮件
  15. java集合(2)- java中HashMap详解
  16. web Function函数
  17. js写法【3】
  18. (转)【深度长文】循序渐进解读Oracle AWR性能分析报告
  19. 【BZOJ 4569】 4569: [Scoi2016]萌萌哒 (倍增+并查集)
  20. VisualStudio使用技巧及快捷键

热门文章

  1. CF1066A Vova and Train(模拟)
  2. .Net core 使用TimeJob
  3. 转:30分钟学会如何使用Shiro
  4. Web Services简单介绍
  5. vue 图片压缩 基于cli3 配置
  6. windows下nginx的安装
  7. thinkphp5使用workerman定时器定时爬取某站点新闻资讯等内容
  8. PHP获取当月天数,获取当月的每天的开始和结束的时间戳,获取当月每号
  9. day 25 模块与包
  10. BugkuWEB矛盾