一 源代码
#include<stdio.h>
#include<semaphore.h>
#include<fcntl.h>
#include<unistd.h>
#define TOTALNUMS 512
#define CHILDPROCS 8
#define BUFSIZE 10
#define OPENFLAG (O_CREAT|O_TRUNC|O_RDWR)
int main(int argc,char* argv[]){
sem_t *empty,*full,*mutex;
int fd;
pid_t p;
int buf_in=0;
int buf_out=0;
int i,j,data;
if((empty=sem_open("empty", OPENFLAG, 0666,BUFSIZE))==SEM_FAILED){
perror("sem_open() error");
return -1;
}
if((full=sem_open("full", OPENFLAG, 0666,0))==SEM_FAILED){
perror("sem_open() error");
return -1;
}
if((mutex=sem_open("mutex",OPENFLAG,0666,1))==SEM_FAILED){
perror("sem_open() error");
return -1;
}
if((fd=open("buffer", OPENFLAG, 0666))==-1){
perror("open() error");
return -1;
}
lseek(fd, sizeof(int)*BUFSIZE, SEEK_SET);
write(fd,&buf_out,sizeof(int));
if((p=fork())==0){
for(i=0;i<TOTALNUMS;i++){
sem_wait(empty);
sem_wait(mutex);
lseek(fd, sizeof(int)*buf_in, SEEK_SET);
write(fd,&i,sizeof(int));
buf_in=(buf_in+1)%BUFSIZE;
sem_post(mutex);
sem_post(full);
}
return 0;
}else if(p<0){
perror("fork() error");
return -1;
}
for(i=0;i<CHILDPROCS;i++){
if((p=fork())==0){