#include"ipc.h"
int main(int argc,char *argv[]){
int i;
int rate;
int w_mid;
int count=MAXVAL;
Msg_buf msg_arg;
struct msqid_ds msg_inf;
buff_key=101;
buff_num=CHAIR;
shm_flg=IPC_CREAT|0644;
buff_ptr=(int*)set_shm(buff_key,buff_num,shm_flg);
waiting_key=102;
waiting_num=1;
waiting_ptr=(int*)set_shm(waiting_key,waiting_num,shm_flg);
// 注册消息队列
quest_flg=IPC_CREAT|0644;
quest_key=201;
quest_id=set_msq(quest_key,quest_flg);
respond_flg=IPC_CREAT|0644;
respond_key=202;
respond_id=set_msq(respond_key,respond_flg);
quit_flg=IPC_CREAT|0644;
quit_key=250;
quit_id=set_msq(quit_key,quit_flg);
//注册信号量
w_key=301;
a_key=302;
p_key=303;
sem_flg=IPC_CREAT|0644;
sem_val=1;
w_mtx=set_sem(w_key,sem_val,sem_flg);
a_mtx=set_sem(a_key,sem_val,sem_flg);
p_mtx=set_sem(p_key,sem_val,sem_flg);
msg_arg.mid=getpid();
//设置等待
char temp;
printf("输入任意字符结束等待:\n");
scanf("%c",&temp);
int c_pid;
//控制体
while(1){
//没有新顾客
if(count>0){
quest_flg=IPC_NOWAIT;
if(msgrcv(quest_id,&msg_arg,sizeof(msg_arg),FINISHED,quest_flg)>=0){
count++;
/*if(pipe(pipe1)<0||pipe(pipe2))
perror("pipe not create\n");
close(pipe1[1]);
close(pipe2[0]);
read(pipe1[0],&tran,sizeof(int));
c_pid=tran;
write(pipe2[1],&tran,sizeof(int));
close(pipe1[0]);
close(pipe2[1]);*/
// printf("%d barber finished working for %d customer\n",msg_arg.mid,c_pid);
msg_arg.mtype=msg_arg.cmid;
msgsnd(quit_id,&msg_arg,sizeof(msg_arg),0);
}
else if(msgrcv(quest_id,&msg_arg,sizeof(msg_arg),READERQUEST,quest_flg)>=0){
//有理发师请求工作
count--;
msg_arg.mtype=msg_arg.mid;
msgsnd(respond_id,&msg_arg,sizeof(msg_arg),0);
printf("%d barber quest work\n",msg_arg.mid);
}
else if(msgrcv(quest_id,&msg_arg,sizeof(msg_arg),WRITERQUEST,quest_flg)>=0){
//有顾客到
w_mid=msg_arg.mid;
count-=MAXVAL;
while(count<0){
msgrcv(quest_id,&msg_arg,sizeof(msg_arg),FINISHED,0);
count++;
printf("%d barber finished\n",msg_arg.mid);
}
//允许顾客等待
msg_arg.mtype=w_mid;
msgsnd(respond_id,&msg_arg,sizeof(msg_arg),0);
printf("%d customer request wait\n",msg_arg.mid);
}
}
if(count==0){
//有顾客在写pid
msgrcv(quest_id,&msg_arg,sizeof(msg_arg),FINISHED,0);
count=MAXVAL;
//printf("%d\n",buff_ptr[0]);
printf("%d customer finished write pid\n",msg_arg.mid);
if(msgrcv(quest_id,&msg_arg,sizeof(msg_arg),READERQUEST,quest_flg)>=0){
count--;
//long temp=msg_arg.mtype;
msg_arg.mtype=msg_arg.mid;
msgsnd(respond_id,&msg_arg,sizeof(msg_arg),0);
printf("%d barber quest work\n",msg_arg.mid);
//msg_arg.mtype=temp;
}
}
}
return EXIT_SUCCESS;
}
没有合适的资源?快使用搜索试试~ 我知道了~
操作系统 实验五、进程互斥实验
共20个文件
c~:5个
c:4个
o:4个
需积分: 16 42 下载量 176 浏览量
2010-05-30
09:56:51
上传
评论 1
收藏 42KB RAR 举报
温馨提示
理发店问题:假设理发店的理发室中有3个理发椅子和3个理发师,有一个可容纳4个顾客坐等理发的沙发。此外还有一间等候室,可容纳13位顾客等候进入理发室。顾客如果发现理发店中顾客已满(超过20人),就不进入理发店。 在理发店内,理发师一旦有空就为坐在沙发上等待时间最长的顾客理发,同时空出的沙发让在等候室中等待时间最长的的顾客就坐。顾客理完发后,可向任何一位理发师付款。但理发店只有一本现金登记册,在任一时刻只能记录一个顾客的付款。理发师在没有顾客的时候就坐在理发椅子上睡眠。理发师的时间就用在理发、收款、睡眠上。 请利用linux系统提供的IPC进程通信机制实验并实现理发店问题的一个解法。
资源推荐
资源详情
资源评论
收起资源包目录
ex5.rar (20个子文件)
ex5
barber.o 7KB
controler 17KB
barber.c~ 2KB
customer.c~ 2KB
controler.c~ 4KB
barber 16KB
controler.c 4KB
ipc.o 10KB
barber.c 2KB
customer.o 7KB
ipc.h~ 1KB
customer.c 2KB
controler.o 9KB
ipc.h 1KB
baber.c~ 2KB
Makefile 509B
Makefile~ 509B
customer 16KB
ipc.c 3KB
ipc.c~ 1B
共 20 条
- 1
资源评论
han743153725
- 粉丝: 0
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功