好文档 - 专业文书写作范文服务资料分享网站

实验三:生产者与消费者 - 图文

天下 分享 时间: 加入收藏 我要投稿 点赞

. . . .

} Linux下代码:

//主进程 #include #include #include \int main() { int id = semget(SEM_ALL_KEY, 3, IPC_CREAT|0660);//创建信号量集合 //初始化信号量集合 semctl(id, SEM_EMPTY, SETVAL, 3); semctl(id, SEM_FULL, SETVAL, 0); semctl(id, SEM_MUTEX, SETVAL, 1); int shmid = createQueue(); //创建共享主存 if(shmid<0) { perror(\exit(1); } //生成生产者进程 if(fork()==0) execl(\if(fork()==0) execl(\ . . . .

. . . .

//生成消费者进程 if(fork()==0) execl(\if(fork()==0) execl(\if(fork()==0) execl(\//等待子进程 int stat,i; for(i=0;i<5;i++) wait(&stat); removeQueue(shmid);//释放共享主存return 0; } /*生产者*/ #include \main(int argc,char * argv[]) { struct queue *buf,*out; int sem_id = semget(SEM_ALL_KEY,3, IPC_CREAT|0660); int i,j; buf = getQueue();//打开共享主存 out = buf; for(i=0;i<6;i++) { p(sem_id, SEM_EMPTY); //P(EMPTY),EMPTY开始值为3,表明有三个空余,申请一个 . . . .

. . . .

之后,有两个空余,当为零时,不再往里面写数据 p(sem_id, SEM_MUTEX); //P(MUTEX),MUTEX开始值为1,表明一次只能运行一个进程 buf->buf++; //产品数+1 //放入产品后缓冲区置1 (buf + buf->buf) ->buf = 1; //获取当前时间 struct timeval curtime; gettimeofday(&curtime,NULL); //输出信息 printf(\,argv[0],curtime.tv_sec,curtime.tv_usec); printf(\for(j=1;j<=3;j++) printf(\printf(\v(sem_id, SEM_MUTEX); //V(MUTEX) v(sem_id, SEM_FULL); //V(FULL),释放一个FULL,即往里面写了一个数据 //随机 sleep 一会 int ran=random()%5; sleep(ran); } } /*消费者*/ #include \main(int argc,char * argv[]) { . . . .

. . . .

struct queue *buf,*out; int sem_id = semget(SEM_ALL_KEY, 3, IPC_CREAT|0660); int i,j; buf = getQueue();//打开共享主存 out = buf; for(i=0;i<4;i++) { p(sem_id, SEM_FULL); //P(FULL) FULL开始值为0,表明开始的时候没有数据,无法取得,当producer释放一个数据时,这里开始有数据 p(sem_id, SEM_MUTEX); //P(MUTEX) (buf + buf->buf) ->buf = 0; buf->buf--; //产品数-1 //获取当前时间 struct timeval curtime; gettimeofday(&curtime,NULL); //输出信息 printf(\,argv[0],curtime.tv_sec,curtime.tv_usec); printf(\for(j=1;j<=3;j++) printf(\printf(\v(sem_id, SEM_MUTEX); //V(MUTEX) v(sem_id, SEM_EMPTY); //V(EMPTY) //取出产品后缓冲区置0 . . . .

. . . .

//随机等待一段时间 int ran=random()%5; sleep(ran); } }

Windows运行截图:

Linux下截图:

. . . .

. . . .

. . . .

实验三:生产者与消费者 - 图文

....}Linux下代码://主进程#include#include#include\intmain(){intid=semget(SEM_ALL_KEY,3,
推荐度:
点击下载文档文档为doc格式
9vyp62qd544m0xd0pw4b4c2db011w500m5w
领取福利

微信扫码领取福利

微信扫码分享