. . . .
} Linux下代码:
//主进程 #include
. . . .
//生成消费者进程 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下截图:
. . . .
. . . .
. . . .
实验三:生产者与消费者 - 图文
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)