要求是:生产者进程生成Catalan序列,并将其写入到内存共享对象。消费者进程从共享内存中读取并输出序列。生产者进程要在命令行指定生成Catalan数的数目。例如,命令行指定5,说明生产者进程会生成5个Catalan数:1   2   5   14   42

这里的实现没有显式创建进程,因为打开不同的命令行窗口就于创建新进程。

//生产者(write)
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <string.h>
#include <signal.h>#define MAX 32
void *pAddr;
int shmId;struct Msg{int flag;//0为读,1为写long long content[MAX];
};                          //content:存catalan数   flag:共享内存占用标志的信号void Handle(int s){if(s == 2){//本函数调用并不删除所指定的共享内存区,而只是将先前用shmat函数连接(attach)好的共享内存脱离(detach)目前的进程shmdt(pAddr);     shmctl(shmId,IPC_RMID,0);  //完成对共享内存的控制,删除这片共享内存exit(0);}
} int main(){int n = 0;    //Catalan数的数目int i=0,j=0;/*按ctrl+c键退出时会处理这个消息,进行共享内存卸载、删除操作(handle功能),最后exit(0)退出程序signal函数和书上的信号量signal不一样,这里的功能使调用handle函数并把2作为handle的参数*/signal(2,Handle);/*key_t ftok(char *fname,int id)将一个已存在的路径名和一个整数标识符转换成一个key_t值得到IPC通信的key,用于创建共享内存。"."表示文件名为当前目录,按照ftok的规则,由于我的read程 序也在当前目录,使用的ftok函数的参数相同,因此得到的key也相同*/key_t key = ftok(".",2);/* 创建共享内存,shmId是共享内存标识符100表示申请的共享内存是100字节;IPC_CREAT | IPC_EXCL | 0666 :前两个保证创建新内存,否则返            回值为-1,0666是3位八进制数,6即二进制110,表示可读可写不可执行,从左到右分别对应当前用户, group组用户,其他用户*/  shmId = shmget(key,100,IPC_CREAT | IPC_EXCL | 0666); pAddr = shmat(shmId,0,0);  //把共享内存区对象映射到调用进程的地址空间,随后可像本地地址空间一样进行访问,第二个参数指定为0让内核决定内存的位置,第三个参数0表示可读写if(*(int *)pAddr == -1){printf("shmat error!\n"); exit(0);}memset(pAddr,0,100); //将pAddr处的100个字节设置为NULLstruct Msg *msg = (struct Msg *)pAddr; //msg 指向共享内存msg->flag = 1;       //表示写进程占用共享内存while(1){if(msg->flag == 1){//当为1时写消息,此时读文件中不能操作此共享内存i=0;  for(i=0;i<MAX;i++)msg->content[i]=0;    //初始化printf("The number of catalan:");scanf("%d",&n);msg->content[0] = 1;for(j=1;j<n;j++)msg->content[j] = msg->content[j-1]*(4*j+2)/(j+2); //计算Catalan数msg->flag = 0;//当写消息后flag置为0,让读文件开始执行读操作,此时写文件不能进行写操作}else{sleep(1);        //停止1s,让读进程读取msg指向的数据(共享内存)并输出}}return 0;
}
//消费者(read)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <string.h>
#include <signal.h>
#define MAX 32void *pAddr;
int shmId;struct Msg{int flag;long long content[MAX];
};int main(){int i=0;key_t key = ftok(".",2);shmId = shmget(key,0,0); //key与writed的key相同,后两个0表示获取该共享内存pAddr = shmat(shmId,0,0); //获取共享内存的地址if(*(int *)pAddr == -1){printf("shmat error!\n"); exit(0);}struct Msg * msg = (struct Msg *)pAddr;while(1){if(msg->flag == 0){//当为0时读消息,此时写文件中不能操作此共享内存i=0;while(msg->content[i]!=0){printf("%lld\n",msg->content[i]);i++;}msg->flag = 1;}else{sleep(1); }} return 0;
}

本文参考

参考源码  https://blog.csdn.net/qq_29762941/article/details/79985377

共享内存函数 https://blog.csdn.net/guoping16/article/details/6584058

signal()函数 https://blog.csdn.net/chenjianqi0502/article/details/78579541

shmget的参数https://blog.csdn.net/ec06cumt/article/details/51444961   https://blog.csdn.net/Fly_as_tadpole/article/details/81044096

ftok()函数

https://www.cnblogs.com/joeblackzqq/archive/2011/05/31/2065161.html  https://www.cnblogs.com/HectorInsanE/archive/2011/03/17/1986859.html

两个进程共享内存,一个写,一个读相关推荐

  1. 完善博文 共享内存一写多读无锁实现的代码逻辑部分

    使用共享内存(内存映射)实现发布订阅模式 多进程实现PubSub发布订阅模式,从而实现进程间的通信. 通信方式可以是TCP/UDP,管道Pipe/消息队列,共享内存shared memory等等.其中 ...

  2. java 共享内存获取写权限_跨进程访问共享内存的权限问题

    问:我在服务器上用 CreateFileMapping 创建了一段共享内存.让这个exe始终在服务器上跑. 同时,别的用户在客户端用IE访问服务器,将要查询的数据通过C#制作的网页提交上来,服务器得到 ...

  3. 操作系统实验报告7:进程间通信—共享内存。实现一个带有n个单元的线性表的并发维护。

    操作系统实验报告7 实验内容 实验内容:进程间通信-共享内存.实现一个带有n个单元的线性表的并发维护. 建立一个足够大的共享内存空间(lock, M),逻辑值lock用来保证同一时间只有一个进程进入M ...

  4. 字符串右移n位,例如 “hello world“ 右移两位 后ldhello wor 要求写一个方法实现此功能,方法的格式是 String moveToRight(String str,int po

    字符串右移n位,例如 "hello world" 右移两位 后ldhello wor 要求写一个方法实现此功能,方法的格式是 String moveToRight(String s ...

  5. win32进程共享内存

    在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.WIN32 API提供了许多函数使我们能够方便高效的进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换.     进程间 ...

  6. python进程共享内存_Python进程间通信之共享内存

    前一篇博客说了怎样通过命名管道实现进程间通信,但是要在windows是使用命名管道,需要使用python调研windows api,太麻烦,于是想到是不是可以通过共享内存的方式来实现.查了一下,Pyt ...

  7. python跨进程共享内存

    生成内存地址name # In the first Python interactive shell import numpy as np import time a = np.array([1, 1 ...

  8. 共享内存 传一个类指针_共享内存介绍:Shared Memory

    In computer hardware, shared memory refers to a (typically large) block of random access memory (RAM ...

  9. 我是如何学习写一个操作系统(七):进程的同步与信号量

    前言 在多进程的运行环境下,进程是并发执行的,不同进程间存在着不同的相互制约关系.为了协调进程之间的相互制约关系,达到资源共享和进程协作,避免进程之间的冲突,引入了进程同步的概念. 临界资源 多个进程 ...

最新文章

  1. GitLab 上市,市值高达 149 亿美元!GitHub 的头号劲敌来了
  2. 广东省哈工大(深圳)赛区赛事活动安排
  3. python字符计数怎样去除空格_去除python中的字符串空格的简单方法
  4. request和response对象如何解决中文乱码问题?
  5. remote: GitLab: Author ‘xxx‘ is not a member of team(Git修改和配置本地用户名和邮箱)
  6. oracle adg 改密码,Oracle ADG数据库切换
  7. winform窗体控件多,加载慢、卡顿的解决办法
  8. Android-Universal-Image-Loader三大组件DisplayImageOptions、ImageLoader、ImageLoaderConfiguration详解...
  9. android 多线程概述
  10. unity2D相机跟随
  11. MySQL分页查询中该避开的坑
  12. Windows 定时关机命令
  13. oracle中的内连接和外连接区别
  14. No handler found for OPTIONS /lca/lcaplan/lcaplanprocess/list
  15. 区块链、人工智能和物联网之间是什么关系?
  16. 反常识—股票暴跌收益会更高
  17. Flutter入门综合练习
  18. “木兰”致歉背后的思考,为什么物联网也能用Python
  19. 金融行业软件测试面试题(含答案)
  20. 【编译原理学习笔记】1:符号和符号串,文法和语言,文法的类型

热门文章

  1. 如何删除PDF水印?PDF删除水印怎么操作
  2. Window程序设计(一)
  3. Android学习网址大全
  4. 栈和队列以及线性表的区别
  5. MAC版snailSVN使用
  6. 用连接去创造,研发不再成为老大难
  7. Elasticsearch:在 Java 客户端中使用 scroll 来遍历搜索结果 - Elastic Stack 8.x
  8. 对话哈希未来贾英昊:资产上链的第一性原理 |链捕手
  9. 计算机视觉之人脸识别(Yale数据集)--HOG和ResNet两种方法实现
  10. pandas.Series.plot的简单参数使用说明