专栏中心

EEPW首页 > 专栏 > Linux共享内存和信号量的实例

Linux共享内存和信号量的实例

发布人:hikesoso2010 时间:2011-03-09 来源:工程师 发布文章
 #include<sys/types.h>

  #include<linux/sem.h>

  #include<linux/shm.h>

  #include<unistd.h>

  #include<stdio.h>

  #include<errno.h>

  #include<time.h>

  #define MAXSHM 5  //定义缓冲区数组的下标变量个数

  /*        定义3个信号量的内部标识  */

  int fullid;

  int emptyid;

  int mutexid;

  /* 主函数  */

  int main()

  {

  /*  定义2个共享内存的ID  */

  int arrayid;

  int getid;

  /*  定义共享内存虚拟地址  */

  int *array;

  int *get;

  /* 创建共享内存  */

  arrayid=shmget(IPC_PRIVATE,sizeof(int) *MAXSHN,IPC_CREAT|0666);

  getid=shmget(IPC_PRIVATE,sizeof(int),IPC_CREAT|0666);

  /*  初始化共享内存  */

  array=(int *) shmat(arrayid,0,0);

  get=(int *) shmat(getid,0,0);

  *get=0;

  /* 定义信号量数据结构 */

  struct sembuf  P,V;

  union semun arg;

  /* 创建信号量  */

  fullid=semget(IPC_PRIVATE,1,IPC_CREAT|0666);

  emptyid=semget(IPC_PRIVATE,1,IPC_CREAT|0666);

  mutexid=semget(IPC_PRIVATE,1,IPC_CREAT|0666);

  /*初始化信号量 */

  arg.val=0;            //初始时缓冲区中无数据

  if(semctl(fullid,0,SETVAL,arg)==-1)

  perror(“semctl setval error”);

  arg.val=MAXSHM;       //初始时缓冲区中有5个空闲的数组元素

  if(semctl(emptyid,0,SETVAL,arg)==-1)

  perror(“semctl setval error”);

  arg.val=1;            //初始时互斥信号为1,允许一个进程进入

  if(semctl(mutexid,0,SETVAL,arg)==-1)

  perror(“semctl setval error”);

  /* 初始化 P  V操作  */

  P.sem_num=0;

  P.sem_op=-1;

  P.sem_flg=SEM_UNDO;

  V.sem_num=0;

  V.sem_op=1;

  V.sem_flg=SEM_UNDO;

  /*   生产者进程  */

  if(fork()==0)

  {

  int i=0;

  int set=0;

  while(i<10)

  {

  semop(emptyid,&P,1);         //对 emptyid执行P操作

  semop(mutexid,&P,1);         //对 mutexid执行 P操作

  array[set%MAXSHM]=i+1;

  printf(“Producer put number %d to No.%d\n”,array[set%MAXSHM],set%MAXSHM);

  set++;                       //写计数加1

  semop(mutexid,&V,1);         //对mutexid执行 V 操作

  semop(fullid,&V,1);          //对fullid执行 V 操作

  i++;

  }

  sleep(3);                    //SLEEP 3秒,等待消费者进程执行完毕

  printf(“Poducer if over\n”);

  exit(0);

  }

  else

  {

  /*  消费者A进程  */

  if(fork()==0)

  {

  while(1)

  {

  if(*get==10)

  break;

  semop(fullid,&P,1);        //对fullid执行 P 操作

  semop(mutexid,&P,1);       //对mutexid执行 P 操作

  printf(“The ConsumerA get number from No.%d\n”,(*get)%MAXSHM);

  (*get)++;                   //读计数加1

  semop(mutexid,&V,1);        //对mutexid执行 V 操作

  semop(emptyid,&V,1);        //对fullid执行 V 操作

  sleep(1);

  }

  printf(“ConsunerA is over\n”);

  exit(0);

  }

  else

  {

  /*消费者B进程  */

  if(fork()==0)

  {

  while(1)

  {

  if(*get==10)

  break;

  semop(fullid,&P,1);       //对fullid执行 P 操作

  semop(mutexid,&P,1);      //对mutexid执行 P 操作

  printf(“The ConsumerA get number from No.%d\n”,(*get)%MAXSHM);

  (*get)++;                 //读计数加1

  semop(mutexid,&V,1);      //对mutexid执行 V 操作

  semop(emptyid,&V,1);      //对emptyid执行 V 操作

  sleep(1);

  }

  printf(“ConsunerB is over\n”);

  exit(0);

  }

  }

  }

  /*   父进程返回后回收3个子进程  */

  wait(0);

  wait(0);

  wait(0);

  /*  断开并撤消2个共享内存  */

  shmdt(array);

  shmctl(arrayid,IPC_RMID,0);

  shmctl(get);

  shmctl(getid,IPC_RMID,0);

  /*   撤消3个信号量集  */

  semctl(emptyid,IPC_RMID,0);

  semctl(fullid,IPC_RMID,0);

  semctl(mutexid,IPC_RMID,0);

  exit(0);

  }

     96堆栈 软件编程网http://www.96dz.com,提供C语言、C++编程、VC++编程、Java编程、C#编程、NET编程、Linux编程、Web编程等全面技术信息

专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词:

相关推荐

《TI的实时操作系统DSP_BIOS介绍》PDF课件下载

NTT测试光交换以管理数据中心负载

网络与存储 2025-12-24

采用ADP1043A的数字电源设计实例

视频 2010-06-12

这个AI能在石头剪刀布上打败你

《PLC实用子程序》配套源代码下载

瑞萨发布多域SDV平台R-Car第五代

《Linux应用开发技术详解》配套工具下载

Bosch Sensortec与乐鑫科技宣布达成战略合作推动多场景传感创新

倪光南:“AI+空间计算”让机器人看懂世界,希望形成“AI+RV芯片”的生态

Cloudera:AI重塑金融服务的决策体系

智能计算 2025-12-24

《TI的实时操作系统DSP_BIOS介绍》PPT视频下载

电源产品的可靠性设计(上)

视频 2010-06-12

《MCS-51单片机应用开发实用子程序》配套源代码下载

FCC禁止外国制造的无人机、无人机零件还有电机和电池?

虚拟发电厂玩模仿游戏

NCL30000单段式功率因数校正LED驱动器原理及TRIAC调光LED驱动器设计方案(上)

视频 2010-06-12

NCL30000单段式功率因数校正LED驱动器原理及TRIAC调光LED驱动器设计方案(下)

视频 2010-06-12

下一代量子计算机几乎将变得有用

基于SMD封装的高压CoolMOS

视频 2010-06-12

守护AI时代高性能计算“芯”安全,安谋科技“山海”S30FP/S30P SPU IP发布

2025-12-24
更多 培训课堂
更多 焦点
更多 视频

技术专区