大连理工大学软件学院操作系统第二次上机Word下载.docx

上传人:b****6 文档编号:18887974 上传时间:2023-01-02 格式:DOCX 页数:23 大小:1.31MB
下载 相关 举报
大连理工大学软件学院操作系统第二次上机Word下载.docx_第1页
第1页 / 共23页
大连理工大学软件学院操作系统第二次上机Word下载.docx_第2页
第2页 / 共23页
大连理工大学软件学院操作系统第二次上机Word下载.docx_第3页
第3页 / 共23页
大连理工大学软件学院操作系统第二次上机Word下载.docx_第4页
第4页 / 共23页
大连理工大学软件学院操作系统第二次上机Word下载.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

大连理工大学软件学院操作系统第二次上机Word下载.docx

《大连理工大学软件学院操作系统第二次上机Word下载.docx》由会员分享,可在线阅读,更多相关《大连理工大学软件学院操作系统第二次上机Word下载.docx(23页珍藏版)》请在冰豆网上搜索。

大连理工大学软件学院操作系统第二次上机Word下载.docx

//子程序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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 广告传媒

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1