在上一篇“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. Android中应用锁的实现之账号盗取

    一.前言 前几天忙着公司的活,最近又可以歇歇了,休息不能不做事呀?今天就来研究一下Android中应用锁的实现.应用锁顾名思义就是对app进行加密,在打开app的时候需要输入指定的密码才能打开应用. ...

  2. Maven进行自动构建

    一个很常见的错误就是路径问题,要把jdk放到java工程的路径里,之前一直默认是jre https://blog.csdn.net/lslk9898/article/details/73836745  ...

  3. appium 链接真机运行时报错

    今天用appium链接真机时,碰到的第一个问题:Attempt to re-install io.appium.settings without first uninstalling.(这是日志中显示 ...

  4. vim 更改注释颜色

    在 ~/.vimrc 添加命令: highlight Comment ctermfg=green

  5. java.lang.IllegalAccessException: Class XXXcan not access xxx with modifiers "private"

    field 或者 method 是 provate的 field.setAccessible(true); method.setAccessible(true); 有时候是因为 newinstance ...

  6. Python变量的下划线

    xx: 公有变量 _x: 单前置下划线,私有化属性或方法,from somemodule import *禁止导入,类对象和子类可以访问 __xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部 ...

  7. pat甲级题目1001 A+B Format详解

    pat1001 A+B Format (20 分) Calculate a+b and output the sum in standard format -- that is, the digits ...

  8. 使用 U 盘装个 winXP 原版镜像玩红警

    winXP 自身是不支持 U 盘启动的,所以用 poweriso 直接制作的 U 盘是没用的 可以使用 wintoflash 操作,下载地址: https://wintoflash.en.softon ...

  9. Apache 2.4.12 64位+Tomcat-8.0.32-windows-x64负载集群方案

    上次搞了Apache 2.2的集群方案,但是现在自己的机器和客户的服务器一般都是64位的,而且tomcat已经到8了.重新做Apache 2.4.12 64位+Tomcat-8.0.32-window ...

  10. 推荐MarkDown编辑工具Typora--文本画流程图示例

    程序员界名言:talk is cheap, show me the code CODE: ### 8. 修改预留手机号-per.MCReservedMobilePhoneUpd #### 8.1业务规 ...