您的位置:首页 > 其它

信息安全系统设计基础实验二:固件设计(20135229,20135234)

2015-11-23 20:54 267 查看
北京电子科技学院(BESTI)



课程:信息安全系统设计基础班级:1352姓名:吕松鸿马启扬

学号:2013522920135234 成绩:指导教师:娄嘉鹏实验日期::2015.11.10

 实验密级:预习程度:实验时间:15:30—17:30

仪器组次:必修/选修:必修实验序号:02

一、实验内容

1.开发环境的配置同实验一。

2.将实验代码拷贝到共享文件夹中。

3.在虚拟机中编译代码。

对于多线程相关的代码,编译时需要加-lpthread的库。



4.下载调试

在超级终端中运行可执行文件pthread,运行可执行文件term。







二、代码解析

(1)分析

这个代码是生产者-消费者问题模型的实现。

主程序中分别启动生产者线程和消费者线程。生产者线程不断顺序地将0到1000的数字写入共享的循环缓冲区,同时消费者线程不断地从共享的循环缓冲区读取数据。

生产者首先要获得互斥锁,并且判断写指针+1后是否等于读指针,如果相等则进入等待状态,等候条件变量notfull;如果不等则向缓冲区中写一个整数,并且设置条件变量为notempty,最后释放互斥锁。

(2)源代码注释

#include<stdio.h>[code]

#include<stdlib.h>[code]

#include<time.h>[code]

#include"pthread.h"[code]

#defineBUFFER_SIZE16[code]


/*设置一个整数的圆形缓冲区*/[code]

struct[code]prodcons{

int
buffer[BUFFER_SIZE];
/*缓冲区数组*/

pthread_mutex_tlock;
/*互斥锁*/

int
readpos,writepos;
/*读写的位置*/

pthread_cond_tnotempty;
/*缓冲区非空信号*/

pthread_cond_tnotfull;
/*缓冲区非满信号*/

};


/*初始化缓冲区:初始化缓存指针信息(信号量)*/[code]

voidinit(structprodcons*b)

{

pthread_mutex_init(&b->lock,NULL);

pthread_cond_init(&b->notempty,NULL);

pthread_cond_init(&b->notfull,NULL);

b->readpos=
0
;

b->writepos=
0
;

}


/*向缓冲区中写入一个整数*/[code]

voidput(structprodcons*b,intdata)

{

pthread_mutex_lock(&b->lock);
//获取互斥锁


/*等待缓冲区非满*/

while
((b->writepos+
1
)%BUFFER_SIZE==b->readpos)
//如果读写位置相同

{

printf
(
"waitfornotfull\n"
);

pthread_cond_wait(&b->notfull,&b->lock);
//等待状态变量b->notfull,不满则跳出阻塞

}


/*写数据并且指针前移*/

b->buffer[b->writepos]=data;
//写入数据

b->writepos++;

if
(b->writepos>=BUFFER_SIZE)b->writepos=
0
;


/*设置缓冲区非空信号*/

pthread_cond_signal(&b->notempty);
//设置状态变量

pthread_mutex_unlock(&b->lock);
//释放互斥锁

}


/*从缓冲区中读出一个整数*/[code]

intget(structprodcons*b)

{

int
data;

pthread_mutex_lock(&b->lock);
//获取互斥锁


/*等待缓冲区非空*/

while
(b->writepos==b->readpos)
//如果读写位置相同

{

printf
(
"waitfornotempty\n"
);

pthread_cond_wait(&b->notempty,&b->lock);
//等待状态变量b->notempty,不空则跳出阻塞。否则无数据可读。

}


/*读数据并且指针前移*/

data=b->buffer[b->readpos];
//读取数据

b->readpos++;

if
(b->readpos>=BUFFER_SIZE)b->readpos=
0
;


/*设置缓冲区非满信号*/

pthread_cond_signal(&b->notfull);
//设置状态变量

pthread_mutex_unlock(&b->lock);
//释放互斥锁

return
data;

}


#defineOVER(-1)[code]

struct[code]prodconsbuffer;


/*实现一个生产者程序:生产者线程不断顺序地将0到1000的数字写入共享的循环缓冲区,当生产-1时,程序终止。*/[code]

void[code]*producer(
void
*data)

{

int
n;

for
(n=
0
;n<
1000
;n++){

printf
(
"put-->%d\n"
,n);

put(&buffer,n);

}

put(&buffer,OVER);

printf
(
"producerstopped!\n"
);

return
NULL;

}


/*消费掉缓存中生产出来的数据:消费者线程不断地从共享的循环缓冲区读取数据,当消费-1时,程序终止*/[code]

void[code]*consumer(
void
*data)

{

int
d;

while
(
1
)

{

d=get(&buffer);

if
(d==OVER)
break
;

printf
(
"%d-->get\n"
,d);

}

printf
(
"consumerstopped!\n"
);

return
NULL;

}


intmain(void)

{

pthread_tth_a,th_b;

void
*retval;

init(&buffer);

//创建生产者线程

pthread_create(&th_a,NULL,producer,
0
);

//创建消费者线程

pthread_create(&th_b,NULL,consumer,
0
);

/*等待生产者和消费者结束*/

pthread_join(th_a,&retval);

pthread_join(th_b,&retval);

return
0
;

}


三、遇到的问题及解决

1.找不到文件

文件夹压缩拷贝到共享文件夹bc之后,进入虚拟机,在命令行输入./install.sh配置编译环境失败。显示install.shnotfound。

我们打开的命令行所在的是系统默认位置,应该进入bc再输入命令。

2.执行./term错误

可以通过方法建立一个连接来解决。首先在超级终端中进入/dev文件夹中。

输入命令“ln–sf/dev/tts/0/dev/ttyS0”注意空格与字母l、数字0


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: