仓酷云
标题:
来一发Linux共享内存和旌旗灯号量的实例
[打印本页]
作者:
海妖
时间:
2015-1-16 10:59
标题:
来一发Linux共享内存和旌旗灯号量的实例
对于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好,其实只要你认真学习无论什么版本都挺好的。
作者:
海妖
时间:
2015-1-16 12:06
标题:
来一发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的心得体会,希望对大家的学习有所帮助,由于水平有限,本文难免有所欠缺,望请指正。
作者:
若相依
时间:
2015-1-18 14:36
主流Linux发行版都自带非常详细的文档(包括手册页和FAQ),从系统安装到系统安全,针对不同层次的人的详尽文档,仔细阅读文档后40%问题都可在此解决。
作者:
不帅
时间:
2015-1-27 07:10
Linux只是个内核!这点很重要,你必须理解这一点。只有一个内核是不能构成一个操作系统的。
作者:
蒙在股里
时间:
2015-2-5 06:24
任何人都可以根据自己的喜好来定制适合自己的操作系统,Linux?是抢占式多任务多用户操作系统.
作者:
小魔女
时间:
2015-2-11 08:03
Linux最大的特点就是其开源性,这一点是十分难得的,这也是它能够存在到现在的原因之一。
作者:
兰色精灵
时间:
2015-3-2 01:19
其次,Linux简单易学,因为我们初学者只是学的基础部分,Linux的结构体系非常清晰,再加上老师循序渐进的教学以及耐心的讲解,使我们理解起来很快,短期内就基本掌握了操作和运行模式。
作者:
分手快乐
时间:
2015-3-11 03:04
笔者五分钟后就给出了解决方法: “首先备份原文件到其他目录,然后删掉/usr/local/unispim/unispimsp.ksc,编辑 /usr/local/unispim/unispimsp.ini,最后重启动计算机
作者:
莫相离
时间:
2015-3-17 20:08
安装一个新的软件时先看README,再看INSTALL然后看FAQ,最后才动手安装,这样遇到问题就知道为什么。如果Linux说明文档不看,结果出了问题再去论坛来找答案反而浪费时间。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2