OS: 生产者消费者问题(二) ---- 系统V IPC通信-信号量和共享内存
在上一篇“OS: 生产者消费者问题(多进程+共享内存+信号量)”中提到的方法二: 如果进程之间并没有父子关系,但是协商好了共享存储的 KEY , 那么在每个进程中,就可以通过 KEY 以及 shmget 函数获得共享存储的 I D , 进而通过 shmat 函数获得共享存储的实际地址,最后访问。
本文采用此种方式进行同步生产者和消费者。
1、头文件myshm.h: 要用到的定义和说明
/*
* myshm.h
*
* Created on: Aug 3, 2013
* Author: root
*/ #ifndef MYSHM_H_
#define MYSHM_H_
#endif /* MYSHM_H_ */ #include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <stdio.h>
#include <string.h>
#define SHMSZ 256 union semun{
int val;
struct semid_ds * buf;
unsigned short * array;
}; void init_a_semaphore(int sid, int semnum, int initval){
union semun semopts;
semopts.val = initval;
semctl(sid, semnum, SETVAL, semopts);
} int semaphore_P(int sem_id){
struct sembuf sb;
sb.sem_num=;
sb.sem_op = -;
sb.sem_flg = SEM_UNDO;
if(semop(sem_id, &sb, ) == -){
printf("semaphore_P failed.\n");
return ;
}
return ;
} int semaphore_V(int sem_id){
struct sembuf sb;
sb.sem_num=;
sb.sem_op = ;
sb.sem_flg=SEM_UNDO;
if(semop(sem_id, &sb, ) == -){
printf("semaphore_V failed.\n");
return ;
}
return ;
}
2、生产者程序productProcess.c:
#include "myshm.h" int main(){
char * shm, *s;
int shmid;
int producer, consumer, i;
char readbuf[SHMSZ]; if((consumer = semget((key_t), , IPC_CREAT|)) == -){
printf("server consumer semget failed.\n");
exit();
}
init_a_semaphore(consumer, , ); if((producer = semget((key_t), , IPC_CREAT|)) == -){
printf("server producer semget failed.\n");
exit();
}
///printf("ftok(\"consumer\", 0) = %d", (key_t)1234);
//printf("ftok(\"consumer\", 0) = %d", (key_t)5678);
//printf("ftok(\"consumer\", 0) = %d", ftok("consumer", 0));
//printf("ftok(\"producer\", 0) = %d", ftok("producer", 0));
init_a_semaphore(producer, , ); if((shmid = shmget(ftok("shared",), SHMSZ, | IPC_CREAT)) == -){
printf("server shmget failed.\n");
exit();
}
if((shm = shmat(shmid, (unsigned char*), )) == -){
printf("server shmat failed.\n");
exit();
} for(i=;;i++){
printf("Enter text:");
fgets(readbuf, SHMSZ, stdin);
semaphore_P(producer);
printf("process %d enter pv key area", getpid());
sprintf(shm, "Message %4d from producer %d is \"%s\"\n",i, getpid(), readbuf);
semaphore_V(consumer);
if(strcmp(readbuf, "end") == ){
break;
}
}
return ;
}
3、消费者程序ConsumerProcess.c:
#include "myshm.h" int main(){
char * shm;
int shmid;
int producer, consumer, i;
if((consumer = semget((key_t), , IPC_CREAT|)) == -){
printf("consumer semget failed.\n");
exit();
}
//init_a_semaphore(consumer, 0, 1);
if((producer = semget((key_t), , IPC_CREAT|)) == -){
printf("producer semget failed.\n");
exit();
}
//init_a_semaphore(producer, 0, 1); if((shmid = shmget(ftok("shared", ), SHMSZ, |IPC_CREAT)) == -){
printf("shmget failed\n");
exit();
}
if((shm = shmat(shmid, (unsigned char *), )) == -){
printf("shmat failed.\n");
exit();
} for(i=;;i++){
printf("Prepare to get Data from memory\n");
semaphore_P(consumer);
printf("enter pv key memory\n");
printf("Data received:%s\n", shm); sleep();
semaphore_V(producer);
if(strcmp(shm, "end") == ){
break;
}
} semctl(producer, , IPC_RMID,);
semctl(consumer, , IPC_RMID, ); return ;
}
OS: 生产者消费者问题(二) ---- 系统V IPC通信-信号量和共享内存的更多相关文章
- System V IPC 之信号量
本文继<System V IPC 之共享内存>之后接着介绍 System V IPC 的信号量编程.在开始正式的内容前让我们先概要的了解一下 Linux 中信号量的分类. 信号量的分类 在 ...
- 进程间通信IPC:消息队列,信号量,共享内存
2015.3.4星期三 阴天 进程间通信:IPC 文件对象:记录文件描述符,文件开关等 IPC标示符:系统全局的流水号两个进程要通信,打开的是唯一的对象进行通讯,通过key操作 XSI IPC:消息队 ...
- Linux进程IPC浅析[进程间通信SystemV共享内存]
Linux进程IPC浅析[进程间通信SystemV共享内存] 共享内存概念,概述 共享内存的相关函数 共享内存概念,概述: 共享内存区域是被多个进程共享的一部分物理内存 多个进程都可把该共享内存映射到 ...
- (转)OS: 生产者消费者问题(多进程+共享内存+信号量)
转:http://blog.csdn.net/yaozhiyi/article/details/7561759 一. 引子 时隔一年再次用到 cout 的时候,哥潸然泪下,这是一种久别重逢的感动,虽然 ...
- [OS] 生产者-消费者问题(有限缓冲问题)
·最简单的情形--(一个生产者 + 一个消费者 + 一个大小为1的有限缓冲) 首先来分析其中的同步关系: ·必须在生产者放入一个产品之后,消费者才能够从缓冲中取出产品来消费.·只有在消费者从缓冲区中取 ...
- Linux系统编程之命名管道与共享内存
在上一篇博客中,我们已经熟悉并使用了匿名管道,这篇博客我们将讲述进程间通信另外两种常见方式--命名管道与共享内存. 1.命名管道 管道是使用文件的方式,进行进程之间的通信.因此对于管道的操作,实际上还 ...
- Linux IPC实践(10) --Posix共享内存
1. 创建/获取一个共享内存 #include <sys/mman.h> #include <sys/stat.h> /* For mode constants */ #inc ...
- System V IPC(2)-信号量
一.概述 System V信号量与System V消息队列不同.它不是用来在进程间传递数据.它主要 ...
- 4GB内存原32位系统(x86)取舍问题,显卡共享内存Win8.1完全不用担心
情景:集成显卡 配置: 4G显示3.25GB 此时系统自动将用不到的系统完全共享给显卡(768MB而不是256): 看显卡适配器信息,完全共享给了显卡 解说:上图总可用图形内存 = 图2中备用 + 硬 ...
随机推荐
- AcWing 224. 计算器 (BSGS算法)打卡
题目:https://www.acwing.com/problem/content/226/ 题意:有一个计算器能完成三种功能 1.给定Y,Z,P,计算YZModPYZModP 的值: 2.给定Y,Z ...
- [CSP-S模拟测试]:影魔(树状数组+线段树合并)
题目背景 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄.每一个灵魂,都有着自己 ...
- 通过create-react-app从零搭建react环境
一. 快速开始: 全局安装脚手架: $ npm install -g create-react-app 通过脚手架搭建项目: $ create-react-app <项目名称> 开始项目: ...
- 正则匹配class并替换整个class为空
str.replace(/class=[\"|'](.*?)[\"|'].*?/g, '')
- layui表单提交使用form.on('submit(sub)',function (){}) 使用ajax请求时回调不执行的原因及解决方法
ayui使用官方的表单模块form.on('submit(sub)',function (){}) 提交,使用ajax请求向后台请求一个执行结果,根据结果进行处理,出现回调无法执行,并且页面出现了刷新 ...
- java %d %n \n
Java中,%d和%f分别用来表示输出时,替换整型输出和浮点型输出的占位符. 如: int a=28; float b = 13.0f; System.out.printf("整数是:%d% ...
- upc组队赛5 Bulbs
Bulbs 题目描述 Greg has an m × n grid of Sweet Lightbulbs of Pure Coolness he would like to turn on. Ini ...
- ldap认证服务的搭建
1. Ldap服务介绍 LDAP 全称轻量级目录访问协议(英文:Lightweight Directory Access Protocol),是一个运行在 TCP/IP 上的目录访问协议.目录是一个特 ...
- SSO 实现博客系统的单点登录
https://blog.csdn.net/qq1350048638/article/details/78933375 https://blog.csdn.net/yejingtao703/artic ...
- 常用命令--awk
awk '{ BEGIN{stat1} BEGIN{stat2} pattern1{action1} pattern2{action2} ... patternn{actionn} {默认动作,无条件 ...