linux进程实例,

  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

linux进程实例,