仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 696|回复: 8
打印 上一主题 下一主题

[其他Linux] 来一发Linux共享内存和旌旗灯号量的实例

[复制链接]
海妖 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 10:59:33 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
对于linux命令,一定要学会用man和info去查他们的解释;
#include<sys/types.h>
  #include<linux/sem.h>
  #include<linux/shm.h>
  #include<unistd.h>
  #include<stdio.h>
  #include<errno.h>
  #include<time.h>
  #defineMAXSHM5//界说缓冲区数组的下标变量个数
  /*界说3个旌旗灯号量的外部标识*/
  intfullid;
  intemptyid;
  intmutexid;
  /*主函数*/
  intmain()
  {
  /*界说2个共享内存的ID*/
  intarrayid;
  intgetid;
  /*界说共享内存假造地点*/
  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;
  /*界说旌旗灯号量数据布局*/
  structsembufP,V;
  unionsemunarg;
  /*创立旌旗灯号量*/
  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(“semctlsetvalerror”);
  arg.val=MAXSHM;//初始时缓冲区中有5个余暇的数组元素
  if(semctl(emptyid,0,SETVAL,arg)==-1)
  perror(“semctlsetvalerror”);
  arg.val=1;//初始时互斥旌旗灯号为1,同意一个历程进进
  if(semctl(mutexid,0,SETVAL,arg)==-1)
  perror(“semctlsetvalerror”);
  /*初始化PV操纵*/
  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)
  {
  inti=0;
  intset=0;
  while(i<10)
  {
  semop(emptyid,&P,1);//对emptyid实行P操纵
  semop(mutexid,&P,1);//对mutexid实行P操纵
  array[set%MAXSHM]=i+1;
  printf(“Producerputnumber%dtoNo.%d
”,array[set%MAXSHM],set%MAXSHM);
  set++;//写计数加1
  semop(mutexid,&V,1);//对mutexid实行V操纵
  semop(fullid,&V,1);//对fullid实行V操纵
  i++;
  }
  sleep(3);&
12下一页


经常看到有人问用什么版本的linux好,其实只要你认真学习无论什么版本都挺好的。
莫相离 该用户已被删除
9#
发表于 2015-3-17 20:08:16 | 只看该作者
安装一个新的软件时先看README,再看INSTALL然后看FAQ,最后才动手安装,这样遇到问题就知道为什么。如果Linux说明文档不看,结果出了问题再去论坛来找答案反而浪费时间。
分手快乐 该用户已被删除
8#
发表于 2015-3-11 03:04:08 | 只看该作者
笔者五分钟后就给出了解决方法: “首先备份原文件到其他目录,然后删掉/usr/local/unispim/unispimsp.ksc,编辑 /usr/local/unispim/unispimsp.ini,最后重启动计算机
兰色精灵 该用户已被删除
7#
发表于 2015-3-2 01:19:26 | 只看该作者
其次,Linux简单易学,因为我们初学者只是学的基础部分,Linux的结构体系非常清晰,再加上老师循序渐进的教学以及耐心的讲解,使我们理解起来很快,短期内就基本掌握了操作和运行模式。
小魔女 该用户已被删除
6#
发表于 2015-2-11 08:03:26 | 只看该作者
Linux最大的特点就是其开源性,这一点是十分难得的,这也是它能够存在到现在的原因之一。
蒙在股里 该用户已被删除
5#
发表于 2015-2-5 06:24:13 | 只看该作者
任何人都可以根据自己的喜好来定制适合自己的操作系统,Linux?是抢占式多任务多用户操作系统.
不帅 该用户已被删除
地板
发表于 2015-1-27 07:10:25 来自手机 | 只看该作者
Linux只是个内核!这点很重要,你必须理解这一点。只有一个内核是不能构成一个操作系统的。
若相依 该用户已被删除
板凳
发表于 2015-1-18 14:36:53 | 只看该作者
主流Linux发行版都自带非常详细的文档(包括手册页和FAQ),从系统安装到系统安全,针对不同层次的人的详尽文档,仔细阅读文档后40%问题都可在此解决。
海妖 该用户已被删除
沙发
 楼主| 发表于 2015-1-16 12:06:55 | 只看该作者

来一发Linux共享内存和旌旗灯号量的实例

功能实在太强了,在配合exec参数或者通过管道重定向到xargs命令和grep命令,可以完成非常复杂的操作,如果同样的操作用图形界面的工具来完成,恐怕要多花十几陪的时间。
nbsp;//SLEEP3秒,守候消耗者历程实行终了</P>  printf(“Poducerifover\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(“TheConsumerAgetnumberfromNo.%d\n”,(*get)%MAXSHM);
  (*get)++;//读计数加1
  semop(mutexid,&V,1);//对mutexid实行V操纵
  semop(emptyid,&V,1);//对fullid实行V操纵
  sleep(1);
  }
  printf(“ConsunerAisover\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(“TheConsumerAgetnumberfromNo.%d\n”,(*get)%MAXSHM);
  (*get)++;//读计数加1
  semop(mutexid,&V,1);//对mutexid实行V操纵
  semop(emptyid,&V,1);//对emptyid实行V操纵
  sleep(1);
  }
  printf(“ConsunerBisover\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);
  }
</p>
上一页12


写学习日记,这是学习历程的见证,同时我坚持认为是增强学习信念的法宝。以上是我学习Linux的心得体会,希望对大家的学习有所帮助,由于水平有限,本文难免有所欠缺,望请指正。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-26 08:48

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表