生产者和消费者(PV操作、共享内存)
来源:互联网 发布:云计算应用介绍 编辑:程序博客网 时间:2024/06/05 16:52
生产者一直在往共享内存中写数据
#include<sys/sem.h>#include<sys/shm.h>#include<stdio.h>#include<stdlib.h>#include<errno.h>#include"shm.h"int main(){ int ret; int shmid; int semid; int running; void *share_memory; struct shm *shm_buf; //创建信号量 semid = semget(ftok(".",'a'),1,IPC_CREAT); if(semid < 0) { perror("semid:"); exit(1); } //初始化信号量 sem_init(semid,1); //创建共享内存 shmid = shmget(ftok(".",'b'),sizeof(struct shm),IPC_CREAT); if(shmid < 0) { perror("shmget:"); exit(1); } //映射共享内存 share_memory = shmat(shmid,NULL,0); if(share_memory == (void *)-1) { perror("shmat:"); sem_del(semid); exit(1); } printf("share_memory = %p\n",share_memory); //指向共享内存 shm_buf = (struct shm*)share_memory; while(running) { p_sem(semid);// printf("please input something to memory:\n"); scanf("%s",&shm_buf->buf); shm_buf->flag = getpid(); if(strcmp(shm_buf->buf,"end") == 0) { running = 0; } v_sem(semid);//做加法 } sem_del(semid); if(shmdt(share_memory) == -1) { perror("shmdt:"); exit(1); } return 0;}
消费者一直从内存中读取数据,一次读完之后就把内存清空
#include<sys/sem.h>#include<sys/shm.h>#include<sys/fcntl.h>#include<stdio.h>#include<stdlib.h>#include<errno.h>#include<sys/types.h>#include"shm.h"int main(){ struct shm *shm_buf; void *share_memory; int semid; int shmid; int running = 1;//创建信号量,生产者和消费者的key值要对应相等 semid = semget(ftok(".",'a'),1,0666); if(semid == -1) { perror("producer do not exit:"); exit(1); } shmid = shmget(ftok(".",'b'),sizeof(struct shm),IPC_CREAT); if(shmid == -1) { perror("shmget error:"); exit(1); } share_memory = shmat(shmid,NULL,0); if(share_memory == (void *)-1) { perror("shmat failed:"); exit(1); } printf("share_memory = %p\n",share_memory); shm_buf = (struct shm*)share_memory; while(running) { p_sem(semid); printf("process write memory %d: %s\n",shm_buf->flag,shm_buf->buf); if(strcmp(shm_buf->buf,"end") == 0) { //running = 0; exit(1); } shm_buf->flag = 0; memset(shm_buf->buf,0,BUF_SIZE); v_sem(semid); } if(shmdt(share_memory) == -1) { perror("share_memory:"); exit(1); } if(shmctl(shmid,IPC_RMID,NULL) == -1) { perror("shmctl:"); exit(1); } exit(0);}
头文件:
#include<sys/sem.h>#include<sys/shm.h>#include<sys/fcntl.h>#include<stdio.h>#include<stdlib.h>#include<errno.h>#include<sys/types.h>#include"shm.h"int main(){ struct shm *shm_buf; void *share_memory; int semid; int shmid; int running = 1; semid = semget(ftok(".",'a'),1,0666); if(semid == -1) { perror("producer do not exit:"); exit(1); } shmid = shmget(ftok(".",'b'),sizeof(struct shm),IPC_CREAT); if(shmid == -1) { perror("shmget error:"); exit(1); } share_memory = shmat(shmid,NULL,0); if(share_memory == (void *)-1) { perror("shmat failed:"); exit(1); } printf("share_memory = %p\n",share_memory); shm_buf = (struct shm*)share_memory; while(running) { p_sem(semid); printf("process write memory %d: %s\n",shm_buf->flag,shm_buf->buf); if(strcmp(shm_buf->buf,"end") == 0) { //running = 0; exit(1); } shm_buf->flag = 0; memset(shm_buf->buf,0,BUF_SIZE); v_sem(semid); } if(shmdt(share_memory) == -1) { perror("share_memory:"); exit(1); } if(shmctl(shmid,IPC_RMID,NULL) == -1) { perror("shmctl:"); exit(1); } exit(0);}
重写的pv操作、删除信号量和初始化信号量的函数
#include<sys/ipc.h>#include<sys/shm.h>#include<stdlib.h>#include<sys/sem.h>#include"shm.h"int sem_init(int semid,int pid){ union semnum sem_num; sem_num.pid = pid; if(semctl(semid,0,SETVAL,sem_num) == -1) { perror("fail sem_init"); exit(1); } return 0;}int sem_del(int semid){ union semnum sem_num; if(semctl(semid,0,IPC_RMID,sem_num) == -1) { perror("fail sem_del:"); exit(1); } return 0;}int p_sem(int semid){ struct sembuf sem; sem.sem_num = 0; sem.sem_op = -1; sem.sem_flg = SEM_UNDO; if(semop(semid,&sem,1) == -1) { perror("fail to p:"); exit(1); } return 0;}
阅读全文
0 0
- 生产者和消费者(PV操作、共享内存)
- linux 使用共享内存实现生产者消费者,PV操作。
- Linux 用pv操作和共享内存实现生产者与消费者机制
- Linux 用pv操作和共享内存实现生产者与消费者机制
- pv 生产者和消费者
- 生产者消费者问题(PV操作)
- 生产者消费者问题【pv操作】
- 用共享内存实现生产者和消费者
- 进程同步-生产者和消费者(PV操作实现——java多线程模拟)
- java中notify和wait实现操作系统pv操作(单一生产者消费者)
- PV操作(生产者-消费者问题)-1【转帖】
- PV操作(生产者-消费者问题)-2【转帖】
- 用PV操作 实现生产者-消费者问题(C++语言)
- 借生产者/消费者问题讲PV操作
- PV操作——生产者消费者问题
- 实现生产组和消费者的机制,利用共享内存实现文件的打开和读写操作,PV操作。
- 生产者进程和消费者进程共享内存解决方法---循环数组
- 用共享内存实现生产者和消费者的机制
- 12、二叉树的实现及应用-表达式处理
- hdu 1213 基础并查集
- python -m 与 pybot ,结合robot库,采用robotframework框架运行脚本
- 文章标题
- 进程间通信-共享内存
- 生产者和消费者(PV操作、共享内存)
- [Hnoi2010]Bounce 弹飞绵羊
- ActiveMQ的安装及使用
- imagenet2012数据集
- 常见的代码托管平台
- Android O(8.0)创建桌面快捷方式
- ANSYS_CFX
- 运维老鸟教你安装centos6.5如何选择安装包
- Machine Learning3——LDA算法(一种经典的线性学习方法)