大连理工大学软件学院操作系统第二次上机Word下载.docx
《大连理工大学软件学院操作系统第二次上机Word下载.docx》由会员分享,可在线阅读,更多相关《大连理工大学软件学院操作系统第二次上机Word下载.docx(23页珍藏版)》请在冰豆网上搜索。
//子程序ID
pid_tparent;
//父程序ID
/******************缓冲区**********************/
structmy_buffer
{
inthead;
inttail;
intstr[SHM_MAX_SIZE/4];
intnum;
//缓冲区内的数的个数
intis_empty;
};
/****************生产随机数******************/
intg_random()
intrandom;
srand((unsigned)(getpid()+time(NULL)));
random=rand()%10;
//0~9随机数
returnrandom;
}
intgetRandomNum()
random=rand()%21;
//0~20随机数
/*****************PV操作***********************/
//sem_id指的是信号量集合的ID
//sem_num指的是即将处理的信号量在信号量集合中的索引
//P操作
intwaitSem(intsem_id,intsem_num)
structsembufsb;
sb.sem_num=sem_num;
sb.sem_op=-1;
//信号量-1
sb.sem_flg=SEM_UNDO;
if(semop(sem_id,&
sb,1)<
0)
{
perror("
waitSemfailed!
\n"
);
exit
(1);
}
//V操作
intsigSem(intsem_id,intsem_num)
sb.sem_op=1;
//信号量加1
sigSemfailed!
/******************打印结果时间******************/
voidprintTime()
time_tnow;
structtm*timenow;
time(&
now);
timenow=localtime(&
printf("
Actualexecutetime:
%s"
asctime(timenow));
/********************函数主体********************/
intmain()
shm_id=shmget(IPC_PRIVATE,SHM_MAX_SIZE,IPC_CREAT|0666);
//申请共享内存
if(shm_id<
0)//创建失败退出程序
Createsharedmemoryfailed!
structmy_buffer*shmptr;
shmptr=(structmy_buffer*)shmat(shm_id,NULL,1);
//连接共享内存和通信进程空间
if(shmptr==(void*)-1)//连接失败退出程序
Addbuffertosharedmemoryfailed!
//创建信号量,失败则退出
if((sem_id=semget(IPC_PRIVATE,3,SEM_MODE))<
Createsemaphorefailed!
if(semctl(sem_id,SEM_FULL,SETVAL,0)==-1)
Setsemvalueerror!
if(semctl(sem_id,SEM_EMPTY,SETVAL,20)==-1)
if(semctl(sem_id,MUTEX,SETVAL,1)==-1)
//设置shmptr的每项数值
shmptr->
head=0;
tail=0;
num=0;
is_empty=1;
//生产者部分
parent=fork();
if(parent<
Producerforkfailed!
elseif(parent==0)
shmptr=shmat(shm_id,0,0);
//连接空间至共享内存
if(shmptr==(void*)-1)
Addbuffertothesharedmomoryfailed!
intcount=0;
for(inti=0;
i<
N_WORKTIME;
i++)
waitSem(sem_id,SEM_EMPTY);
waitSem(sem_id,MUTEX);
sleep(g_random());
----------------ProduceprocessNo.%d-------------------\n"
i+1);
I'
mthepriducer,PID=%d\n"
getpid());
//生产
intx=getRandomNum();
str[shmptr->
tail]=x;
tail=(shmptr->
tail+1)%SHM_MAX_SIZE;
is_empty=0;
num++;
//输出生产时间
printTime();
intp;
Thenumberinbufferis%d.\n"
shmptr->
num+1);
//放入内存
p=(shmptr->
tail-1==shmptr->
head)?
(shmptr->
tail-1):
tail-1+SHM_MAX_SIZE);
for(p;
!
is_empty)&
&
p>
=shmptr->
head;
p--)
%d"
str[p%SHM_MAX_SIZE]);
Producerputs%dintothememory!
x);
----------------------No.%dend------------------------\n"
fflush(stdout);
sigSem(sem_id,MUTEX);
sigSem(sem_id,SEM_FULL);
//断开连接
shmdt(shmptr);
exit(0);
//消费者程序
N_CONSUMER;
child=fork();
if(child<
{
perror("
Childforkfailed!
}
elseif(child==0)
shmptr=shmat(shm_id,0,0);
for(intj=0;
j<
j++)
----------------ConsumerNo.%dprocessNo.%d-----------------\n"
i+1,j+1);
mtheconsumer,PID=%d\n"
//输出消费时间
if(shmptr->
num!
=0)
//消费
inty=shmptr->
head];
head=(shmptr->
head+1)%SHM_MAX_SIZE;
is_empty=(shmptr->
head==shmptr->
tail);
num--;
intp;
//取出内存
Consumergets%doutofthememory!
y);
else
printf("
Thememoryisempty!
---------------ConsumerN0.%dprocessNo.%dend----------------\n"
sigSem(sem_id,SEM_EMPTY);
//退出主程序
while(wait(0)!
=-1);
//解除连接
shmctl(shm_id,IPC_RMID,0);
shmctl(sem_id,IPC_RMID,0);
Exitthemainprocess!
return0;
截图:
2、代码:
#include<
#defineSHM_MAX_SIZE2//定义共享内存最大空间
constintN_CONSUMER=2;
constintN_PRODUCER=2;
constintN_BUFFER=2;
constintN_WORKTIME=10;
intshm_id=-1;
intsem_id=-1;
intstr[SHM_MAX_SIZE];
srand((unsigned)(getpid()+time(NULL)));
random=rand()%10;
//0~10随机数
random=rand()%2;
//0~1随机数
sb.sem_num=sem_num;
sb.sem_op=-1;
sb.sem_flg=SEM_UNDO;
if(semop(sem_id,&
sb,1)<
0)
intsigSem(intsem_id,intsem_num)
sb.sem_op=1;
structtm*timenow;
timenow=localtime(&
asctime(timenow));
shm_id=shmget(IPC_PRIVATE,SHM_MAX_SIZE*4,IPC_CREAT|0666);
if(shm_id<
0)//创建失败退出程序
shmptr=(structmy_buffer*)shmat(shm_id,NULL,1);
if(shmptr==(void*)-1)//连接失败退出程序
if((sem_id=semget(IPC_PRIVATE,3,SEM_MODE))<
if(semctl(sem_id,SEM_FULL,SETVAL,0)==-1)
if(semctl(sem_id,SEM_EMPTY,SETVAL,10)==-1)
if(semctl(sem_id,MUTEX,SETVAL,1)==-1)
head=0;
tail=0;
num=0;
is_empty=1;
//父亲部分
parent=fork();
if(parent<
Fatherforkfailed!
elseif(parent==0)
shmptr=shmat(shm_id,0,0);
if(shmptr==(void*)-1)
intcount=0;
for(inti=0;
i<
N_WORKTIME;
i++)
waitSem(sem_id,SEM_EMPTY);
waitSem(sem_id,MUTEX);
----------------FatherMakingNo.%d-------------------\n"
i+1);
mFather,PID=%d\n"
getpid());
intx=getRandomNum();
%d"
tail]=x;
tail=(shmptr->
tail+1)%SHM_MAX_SIZE;
is_empty=0;
Thenumberoffruitinplantis%d.\n"
shmptr->
num);
p=(shmptr->
tail-1==shmptr->
head)?
(shmptr->
tail-1):
tail-1+SHM_MAX_SIZE);
if(x==0)
Itisappleintheplant.\n"
elseif(x==1)
Itisorangeintheplant.\n"
sigSem(sem_id,MUTEX);
sigSem(sem_id,SEM_FULL);
//儿子女儿程序,0儿子,1女儿
N_CONSUMER;
child=fork();
if(child<
elseif(child==0)
Addb