在上一篇“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. Network基础(三):网线的制作、交换机基本命令模式、交换机命令行基本配置、交换机的密码设置

    一.网线的制作 目标: 在常见的计算机网络中,网线主要用来连接计算机与交换机(或宽带路由器).交换机与交换机.交换机与路由器,以及需要连网的其他各种设备.网线的制作与测试是作为网络管理员的一个入门技能 ...

  2. xcode Delete current line

    Delete a line like eclipse CTRL+D (tested on Xcode 4.5.1) : First of all, change these rights : sudo ...

  3. (转)Maven中的库(repository)详解 ---repository配置查找构件(如.jar)的远程库

    转:https://blog.csdn.net/taiyangdao/article/details/52287856 Maven中的库(repository)是构件(artifact)的集合.构件以 ...

  4. [转载]真正的inotify+rsync实时同步 彻底告别同步慢

    原文链接http://www.ttlsa.com/web/let-infotify-rsync-fast/ 背景我们公司在用inotify+rsync做实时同步,来解决分布式集群文件一致性的问题.但当 ...

  5. jmeter beanshell 变量传递

    如果写成这样会报错: ${__BeanShell(${__threadNum}*2,ToatlAmount)}; ${__BeanShell(${__Random(1,99999,)},DayNum) ...

  6. -k 组合调用执行部分用例

    场景:只执行符合要求的某一部分用例,通过类与方法的命名实 现.通常编写测试方法时 • 解决:使用-k • pytest -k "TestClass and test_one" • ...

  7. Android 中MediaPlayer播放音频

    1.播放/res/raw/目录下的音频资源 public class MainActivity extends Activity { MediaPlayer mediaPlayer; int posi ...

  8. MySQL字符集不一致导致查询SQL性能问题

    今天做了一个MySQL数据库中的SQL优化. 结论是关联字段字符集不同,导致索引不可用. 查询的SQL如下: select `Alias`.`Grade`, `Alias`.`id`, `Alias` ...

  9. myEclipse 搭建 Spring boot+myBatis+maven 项目流程

    1.新建一个工程 new-->maven project-->next-->next-->在filter中搜索webapp-->group id.Artifact id- ...

  10. ScrollView嵌套listview显示一行bug

    首先看看修复bug之后的显示对比图,结果一目了然 显示一行之前 修改bug之后 主要就是ScrollView嵌套listview显示计算  直接上代码   一目了然 <com.wechaotou ...