完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
我们开始做课程设计了 ,但我不会linux的编程。求助程序啊!!题目是:基于信号量及共享内存的生产者和消费者。
要求是:编写两个程序两个程序使用共享内存sharemem作为产品缓冲区,一个程序作为生产者,一次课产生指定数目的产品(若干字符)添加到共享内存sharemem尾部。另一个程序作为消费者,从共享内存sharemem头部开始消费产品(读取若干字符),然后将已消费字符从共享内存中删除,当共享内存中的字符不足时,消费进程阻塞,直到生产者生产出了指定个数的字符时,使用信号量控制生产者进程和消费者进程对共享内存的互斥访问,并编写编译所需的makefile文件。 求大神给我写个对应的linux程序。一定要写上注释啊!!我还要把程序看懂去答辩。。跪谢!! |
|
相关推荐
1个回答
|
|
可能直接写程序工作量太大了吧。我在网上找了一个程序,大神们能不能就在这个程序上修改一个对应我题目的程序出来啊??
#include "stdio.h" #include #include #include #define SHM_SIZE (1024*1024) #define SHM_MODE 0600 #define SEM_MODE 0600 #if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED) /* union semun is defined by including #else /* according to X/OPEN we have to define it ourselves */ union semun{ int val; struct semid_ds *buf; unsigned short *array; }; #endif struct ShM{ int start; int end; }* pSM; const int N_CONSUMER = 3;//消费者数量 const int N_BUFFER = 5;//缓冲区容量 int shmId = -1,semSetId=-1; union semun su;//sem union,用于初始化信号量 //semSetId 表示信号量集合的 id //semNum 表示要处理的信号量在信号量集合中的索引 void waitSem(int semSetId,int semNum) { struct sembuf ***; ***.sem_num = semNum; ***.sem_op = -1;//表示要把信号量减一 ***.sem_flg = SEM_UNDO;// //第二个参数是 sembuf [] 类型的,表示数组 //第三个参数表示 第二个参数代表的数组的大小 if(semop(semSetId,&***,1) < 0){ perror("waitSem failed"); exit(1); } } void sigSem(int semSetId,int semNum) { struct sembuf ***; ***.sem_num = semNum; ***.sem_op = 1; ***.sem_flg = SEM_UNDO; //第二个参数是 sembuf [] 类型的,表示数组 //第三个参数表示 第二个参数代表的数组的大小 if(semop(semSetId,&***,1) < 0){ perror("waitSem failed"); exit(1); } } //必须在保证互斥以及缓冲区不满的情况下调用 void produce() { int last = pSM->end; pSM->end = (pSM->end+1) % N_BUFFER; printf("生产 %dn",last); } //必须在保证互斥以及缓冲区不空的情况下调用 void consume() { int last = pSM->start; pSM->start = (pSM->start + 1)%N_BUFFER; printf("消耗 %dn",last); } void init() { //缓冲区分配以及初始化 if((shmId = shmget(IPC_PRIVATE,SHM_SIZE,SHM_MODE)) < 0) { perror("create shared memory failed"); exit(1); } pSM = (struct ShM *)shmat(shmId,0,0); pSM->start = 0; pSM->end = 0; //信号量创建 //第一个:同步信号量,表示先后顺序,必须有空间才能生产 //第二个:同步信号量,表示先后顺序,必须有产品才能消费 //第三个:互斥信号量,生产者和每个消费者不能同时进入缓冲区 if((semSetId = semget(IPC_PRIVATE,3,SEM_MODE)) < 0) { perror("create semaphore failed"); exit(1); } //信号量初始化,其中 su 表示 union semun su.val = N_BUFFER;//当前库房还可以接收多少产品 if(semctl(semSetId,0,SETVAL, su) < 0){ perror("semctl failed"); exit(1); } su.val = 0;//当前没有产品 if(semctl(semSetId,1,SETVAL,su) < 0){ perror("semctl failed"); exit(1); } su.val = 1;//为1时可以进入缓冲区 if(semctl(semSetId,2,SETVAL,su) < 0){ perror("semctl failed"); exit(1); } } int main() { int i = 0,child = -1; init(); //创建 多个(N_CONSUMER)消费者子进程 for(i = 0; i < N_CONSUMER; i++) { if((child = fork()) < 0)//调用fork失败 { perror("the fork failed"); exit(1); } else if(child == 0)//子进程 { printf("我是第 %d 个消费者子进程,PID = %dn",i,getpid()); while(1) { waitSem(semSetId,1);//必须有产品才能消费 waitSem(semSetId,2);//锁定缓冲区 consume();//获得产品,需要修改缓冲区 sigSem(semSetId,2);//释放缓冲区 sigSem(semSetId,0);//告知生产者,有空间了 sleep(2);//消费频率 } break;//务必有 } } //父进程开始生产 if(child > 0) { while(1) { waitSem(semSetId,0);//获取一个空间用于存放产品 waitSem(semSetId,2);//占有产品缓冲区 produce(); sigSem(semSetId,2);//释放产品缓冲区 sleep(1);//每两秒生产一个 sigSem(semSetId,1);//告知消费者有产品了 } } return 0; } |
|
|
|
只有小组成员才能发言,加入小组>>
「含关键代码」基于AM3352/AM3354/AM3359的Linux开发案例分享
4872 浏览 0 评论
87364 浏览 0 评论
【高手问答】如何做到精通linux技术?资深工程师带你突破难点
4684 浏览 2 评论
3570 浏览 2 评论
解读Linux :先从创建一个文件夹用来存放jdk压缩文件开始
2459 浏览 0 评论
1953浏览 3评论
这是i.mx6ull的关于usb的宏定义,能解释下这些宏定义的意思
1322浏览 1评论
1233浏览 1评论
求解:aarch64交叉编译工具已经安装成功,环境变量已经配置,怎么将系统架构切换为ARM的架构
1299浏览 0评论
电脑和虚拟机可以互ping,电脑和开发板也可以互ping,但是虚拟机和开发板ping不通是什么原因
1215浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 11:02 , Processed in 0.922555 second(s), Total 46, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号