|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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好,其实只要你认真学习无论什么版本都挺好的。 |
|