在上一篇“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通信-信号量和共享内存的更多相关文章

  1. System V IPC 之信号量

    本文继<System V IPC 之共享内存>之后接着介绍 System V IPC 的信号量编程.在开始正式的内容前让我们先概要的了解一下 Linux 中信号量的分类. 信号量的分类 在 ...

  2. 进程间通信IPC:消息队列,信号量,共享内存

    2015.3.4星期三 阴天 进程间通信:IPC 文件对象:记录文件描述符,文件开关等 IPC标示符:系统全局的流水号两个进程要通信,打开的是唯一的对象进行通讯,通过key操作 XSI IPC:消息队 ...

  3. Linux进程IPC浅析[进程间通信SystemV共享内存]

    Linux进程IPC浅析[进程间通信SystemV共享内存] 共享内存概念,概述 共享内存的相关函数 共享内存概念,概述: 共享内存区域是被多个进程共享的一部分物理内存 多个进程都可把该共享内存映射到 ...

  4. (转)OS: 生产者消费者问题(多进程+共享内存+信号量)

    转:http://blog.csdn.net/yaozhiyi/article/details/7561759 一. 引子 时隔一年再次用到 cout 的时候,哥潸然泪下,这是一种久别重逢的感动,虽然 ...

  5. [OS] 生产者-消费者问题(有限缓冲问题)

    ·最简单的情形--(一个生产者 + 一个消费者 + 一个大小为1的有限缓冲) 首先来分析其中的同步关系: ·必须在生产者放入一个产品之后,消费者才能够从缓冲中取出产品来消费.·只有在消费者从缓冲区中取 ...

  6. Linux系统编程之命名管道与共享内存

    在上一篇博客中,我们已经熟悉并使用了匿名管道,这篇博客我们将讲述进程间通信另外两种常见方式--命名管道与共享内存. 1.命名管道 管道是使用文件的方式,进行进程之间的通信.因此对于管道的操作,实际上还 ...

  7. Linux IPC实践(10) --Posix共享内存

    1. 创建/获取一个共享内存 #include <sys/mman.h> #include <sys/stat.h> /* For mode constants */ #inc ...

  8. System V IPC(2)-信号量

    一.概述                                                    System V信号量与System V消息队列不同.它不是用来在进程间传递数据.它主要 ...

  9. 4GB内存原32位系统(x86)取舍问题,显卡共享内存Win8.1完全不用担心

    情景:集成显卡 配置: 4G显示3.25GB 此时系统自动将用不到的系统完全共享给显卡(768MB而不是256): 看显卡适配器信息,完全共享给了显卡 解说:上图总可用图形内存 = 图2中备用 + 硬 ...

随机推荐

  1. jmeter之-非GUI模式&登录实战

    1.执行测试脚本 jmeter -n -t JMeter分布式测试示例.jmx 2.指定结果文件及日志路径 jmeter -n -t JMeter分布式测试示例.jmx -l report\01-re ...

  2. Django2.0中得url路由path得用法

    Django2.0中,url得匹配规则更新了,在django1.0中,url是用正则表达式书写得,相对来说比较繁琐一些,在django2.0中进行了升级优化,改为了path from django.u ...

  3. 7-4 IP思考

    内网ip和公网Ip 什么是内网IP:  一些小型企业或者学校,通常都是申请一个固定的IP地址,然后通过IP共享(IP Sharing),使用整个公司或学校的机器都能够访问互联网.而这些企业或学校的机器 ...

  4. 90、Tensorflow实现分布式学习,多台电脑,多个GPU 异步试学习

    ''' Created on 2017年5月28日 @author: weizhen ''' import time import tensorflow as tf from tensorflow.e ...

  5. 二级域名解析设置及Apache 子域名配置

    域名管理解析项 如: cy.wanggangg.top 为wanggangg.top域名添加解析 主机记录设为 cy 记录值 为服务器ip地址 打开apache配置文件 新增如下:<Virtua ...

  6. 基于nodejs的一个实时markdown转html工具小程序

    1.版本一 - 1.1`npm install marked --save` 安装markdwon转html的包.- 1.2 使用watchFile监视 markdown文件 /** * Create ...

  7. for循环中执行setTimeout问题(任务队列的问题)

    for(var i=0;i<8;i++){ setTimeout(function () { console.log(i) },0) } 输出了8次8,这跟js的执行顺序和作用域链有关. 规则: ...

  8. apache虚拟主机配置及解析

    Apache虚拟主机配置及解析 1.修改httpd-vhosts.conf 打开apache(Apache24)/conf/extra/httpd-vhosts.conf文件,添加虚拟主机信息,可以这 ...

  9. Django Model里的__str__以及Meta

    举个栗子,注释已经比较详细了 name = models.CharField(max_length=30,verbose_name='标签名称') #max_length=30里的30在mysql以前 ...

  10. Git操作思维导图

    转自:https://blog.csdn.net/mynameishuangshuai/article/details/51657324