linux进程实例,
爸爸给女儿和儿子喂水果。爸爸随机挑选橘子或者苹果,将橘子剥皮或者将苹果削皮放在盘子中,剥皮的速度比较快,而削皮的时间比较慢。女儿只吃橘子,儿子只吃苹果(当然我们假设女儿和儿子永远也吃不饱)。盘子只能装下3个水果。儿子吃得比较快,女儿吃得比较慢。
编程模拟该过程:
简单分析
信号量:
int检修板=1;//表示访问盘子的信号量
int apple=0;//苹果个数
int orange=0;//橘子
int emptyplates=3;//空盘子
int numOfEmptyPlate _ SEM _ id=0;//空盘子的数量。
int numOfApple _ SEM _ id=0;//苹果的数量
int numOfOrange _ SEM _ id=0;//橙色的数量
int getAccesstoPlate=0;//获取板材
int * plate=NULL//3个盘子
结构sembuf P,V;//p,v操作
无效印刷版(const char *arg)
int I=0;
printf( % s n盘子里的水果:,arg);
for(I=0;我我)
printf(%d ,plate[I]);
printf( n );
void father_do() //放水果进去
{//1==苹果,2==范围
int I=0;
semop( numOfEmptyPlate_sem_id,P,1);//P(空盘子)
如果(rand()0 1 50)//得到一个橘子
睡眠(1);//拿个橘子,睡一秒
semop( getAccesstoPlate,P,1);//P(板)
printf(父亲拿到盘子. n );
印刷版(父亲:);
for(I=0;我我)
if(0==plate[I])//找到一个空盘子,把它放进去
printf(%d ,plate[I]);
plate[I]=2;
打破;
semop( numOfOrange_sem_id,V,1);//V(橙子)
父亲在盘子里放了一个橘子. n );
semop( getAccesstoPlate,V,1);//V(板)
父亲把盘子放回原处. n );
else //拿个苹果
睡眠(2);//拿个苹果,睡2秒
semop( getAccesstoPlate,P,1);//P(板)
printf(父亲拿到盘子. n );
印刷版(父亲:);
for(I=0;我我)
if(0==plate[I])//找到一个空盘子,把它放进去
printf(%d ,plate[I]);
plate[I]=1;
打破;
semop( numOfApple_sem_id,V,1);//V(苹果)
父亲把一个苹果放在盘子里. n );
semop( getAccesstoPlate,V,1);//V(板)
父亲把盘子放回原处. n );
void girl _ do()//吃橘子
int I=0;
semop( numOfOrange_sem_id,P,1);//P(橘子)
睡眠(2);//女孩慢慢吃,睡2秒
semop( getAccesstoPlate,P,1);//P(板)
把盘子拿过来. n );
打印盘子(女孩:);
for(I=0;我我)
if( 2==plate[i])
printf(%d ,plate[I]);
plate[I]=0;//吃一个橘子
打破;
semop( numOfEmptyPlate_sem_id,V,1);//V(空盘子)
女孩吃了一个橘子. n );
semop( getAccesstoPlate,V,1);//V(板)
女孩把盘子放回去. n );
void boy_do() //吃苹果
int I=0;
semop( numOfApple_sem_id,P,1);//P(苹果)
睡眠(1);//男孩吃得快,睡一秒
semop( getAccesstoPlate,P,1);//P(板)
男孩拿到盘子. n );
印刷版(男孩:);
for(I=0;我我)
if( 1==plate[i])
printf(%d ,plate[I]);
plate[I]=0;//吃一个苹果
打破;
semop( numOfEmptyPlate_sem_id,V,1);//V(空盘子)
男孩吃了一个苹果. n );
semop( getAccesstoPlate,V,1);//V(板)
男孩把盘子放回去. n );
int main()
/*进程ID*/
pid_t父亲_ id
pid _ t女孩id
pid _ t男孩id
char op=
srand(time(0));//设置随机种子
plate=(int *)mmap(NULL,sizeof(int)*3,PROT _读PROT写
MAP_SHAREDMAP_ANONYMOUS,-1,0);//获取共享内存
plate[0]=0;
plate[1]=0;
plate[2]=0;//所有盘子都是空的。
numOfApple _ SEM _ id=SEM get(IPC _ PRIVATE,1,IPC _ CREAT 00666);
numOfEmptyPlate _ SEM _ id=SEM get(IPC _ PRIVATE,1,IPC _ CREAT 00666);
numOfOrange _ SEM _ id=SEM get(IPC _ PRIVATE,1,IPC _ CREAT 00666);
getAccesstoPlate=SEM get(IPC _ PRIVATE,1,IPC _ CREAT 00666);
//设置信号测量值(3个苹果,0个橘子)
if(-1==SEM CTL(numOfApple _ SEM _ id,0,SETVAL,0)
-1==SEM CTL(numOfEmptyPlate _ SEM _ id,0,SETVAL,3)
-1==semctl(numOfOrange_sem_id,0,SETVAL,0)
-1==semctl(getAccesstoPlate,0,SETVAL,1))
perror(Semctl serval错误! n’);
//初始化p,V操作
五。SEM _ num=0;
五。SEM _ op=1;
V.sem _ flg=SEM _ UNDO
p。SEM _ num=0;
p。SEM _ op=-1;
P.sem _ flg=SEM _ UNDO