看我下面的代码,父进程是消费者,子进程是生产者。
REPEATS决定总共生产的次数(可以自己修改)。
CONSUMER_SPEED决定消费的速度(越大越慢,可以自己修改)。
PRODUCER_SPEED决定生产的速度(越大越慢,可以自己修改)。
我的例子里,生产者生产一个随机数。另外消费速度比生产速度慢,所以可以看到输出中,+++(生产者)开头的出现的比---(消费者)多,当生产者结束后,就只有---打印了。
对这个程序由什么问题,可以baiduhi我。在linux/unix下用gcc编译。
#include<stdio.h>。
#include<unistd.h>。
#include<time.h>。
#include<string.h>。
#include<stdlib.h>。
#include<sys/sem.h>。
#include<sys/shm.h>。
#include<sys/stat.h>。
#defineREPEATS(10)/*countofproduction/consumption*/。
#defineMAX_BUFFER_SIZE(8)。
typedefstruct
{
intbottom;
inttop;
intdata[MAX_BUFFER_SIZE];。
}STRUCT_BUFFER;
STRUCT_BUFFER*pBuffer=NULL;。
/*Definespeedofconsumer/producer,changethemasulike*/。
#definePRODUCER_SPEED(1)/*1/sec*/。
#defineCONSUMER_SPEED(2)/*1/2sec*/。
intsem_consume;/*consumersem*/。
intsem_produce;/*producersem*/。
intshm_buffer;/*sharedbuffer*/。
#defineFLAG(IPC_CREAT|S_IRWXU)。
/*Initsemphores&sharedbuffer*/。
voidinit()
{
unionsemun{
intval;
structsemid_ds*buf;
unsignedshort*array;
}arg;
shm_buffer=shmget(0x1111,sizeof(STRUCT_BUFFER),FLAG);。
pBuffer=shmat(shm_buffer,0,0);。
memset(pBuffer,0,sizeof(STRUCT_BUFFER));。
sem_consume=semget(0x2222,1,FLAG);。
arg.val=0;
if(semctl(sem_consume,0,SETVAL,arg)<0)。
{
perror("Consumer");。
exit(1);
}
sem_produce=semget(0x3333,1,FLAG);。
arg.val=MAX_BUFFER_SIZE;。
if(semctl(sem_produce,0,SETVAL,arg)<0)。
{
perror("Producer");。
exit(1);
}
}
/*destroysemphores&sharedbuffer*/。
voiddeinit()
{
shmctl(shm_buffer,IPC_RMID,NULL);。
semctl(sem_consume,0,IPC_RMID);。
semctl(sem_produce,0,IPC_RMID);。
}
intmain()
{
intpid,i;
structsembufsbuf;
init();
printf("Startfork...\n");。
pid=fork();
if(pid>0)
{
/*parentprocess,consumer*/。
for(i=0;i<REPEATS;i++)。
{
/*Trydecrementing1fromconsumer*/。
sbuf.sem_num=0;
sbuf.sem_op=-1;
sbuf.sem_flg=0;
semop(sem_consume,&sbuf,1);。
/*OK*/
printf("Consumerget%6d\n",pBuffer->data[pBuffer->bottom]);。
pBuffer->bottom=(pBuffer->bottom+1)%MAX_BUFFER_SIZE;。
/*Tryincrementing1toproducer*/。
sbuf.sem_op=1;
semop(sem_produce,&sbuf,1);。
sleep(CONSUMER_SPEED);。
}
wait(0);
shmdt(pBuffer);
}
elseif(pid==0)
{
srand(time(NULL));
/*childprocess,producer*/。
for(i=0;i<REPEATS;i++)。
{
/*Trydecrementing1fromproducer*/。
sbuf.sem_num=0;
sbuf.sem_op=-1;
sbuf.sem_flg=0;
semop(sem_produce,&sbuf,1);。
/*OK*/
pBuffer->data[pBuffer->top]=(rand()%1000)*1000+i+1;。
printf("Producerput%6d\n",pBuffer->data[pBuffer->top]);。
pBuffer->top=(pBuffer->top+1)%MAX_BUFFER_SIZE;。
/*Tryincrementing1toconsumer*/。
sbuf.sem_op=1;
semop(sem_consume,&sbuf,1);。
sleep(PRODUCER_SPEED);。
}
shmdt(pBuffer);
exit(0);
}
deinit();
return0;
}
还没有评论,来说两句吧...