线程实现邮箱通信-实验报告

上传人:飞*** 文档编号:47525392 上传时间:2018-07-02 格式:PDF 页数:10 大小:62.47KB
返回 下载 相关 举报
线程实现邮箱通信-实验报告_第1页
第1页 / 共10页
线程实现邮箱通信-实验报告_第2页
第2页 / 共10页
线程实现邮箱通信-实验报告_第3页
第3页 / 共10页
线程实现邮箱通信-实验报告_第4页
第4页 / 共10页
线程实现邮箱通信-实验报告_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《线程实现邮箱通信-实验报告》由会员分享,可在线阅读,更多相关《线程实现邮箱通信-实验报告(10页珍藏版)》请在金锄头文库上搜索。

1、进程通信实验报告一、实验名称:进程通信 二、实验目的:掌握用邮箱方式进行进程通信的方法,并通过设计实现简单邮箱理解 进程通信中的同步问题以及解决该问题的方法。 三、实验原理:邮箱机制类似于日常使用的信箱。对于用户而言使用起来比较方便, 用户只需使用 send()向对方邮箱发邮件 receive()从自己邮箱取邮件, send ()和 receive ()的内部操作用户无需关心。因为邮箱在内存中实现,其空间有大小限制。其实 send()和 receive ()的内部实现主要还是要解决生产者与消费者问题。四、实验内容:进程通信的邮箱方式由操作系统提供形如send()和 receive ()的系统调

2、用来支持,本实验要求学生首先查找资料了解所选用操作系统平台上用于进程通信的 系统调用具体形式,然后使用该系统调用编写程序进行进程间的通信,要求程序运行结果可 以直观地体现在界面上。在此基础上查找所选用操作系统平台上支持信号量机制的系统调用 具体形式,运用生产者与消费者模型设计实现一个简单的信箱,该信箱需要有创建、发信、 收信、撤销等函数,至少能够支持两个进程互相交换信息,比较自己实现的信箱与操作系统 本身提供的信箱,分析两者之间存在的异同。五、 背景知识介绍:1、sembuf 数据结构 struct sembuf unsigned short int sem_num; /semaphore n

3、umber short int sem_op; /semaphore operation short int sem_flg; /operation flag ; sem_num :操作信号在信号集中的编号,第一个信号的编号是0。进 程 A 进 程 B 信箱 A 信箱 B Send() Send() receive() receive() sem_op :如果其值为正数,该值会加到现有的信号内含值中。通常用于释放所控资源的使用 权;如果 sem_op的值为负数,而其绝对值又大于信号的现值,操作将会阻塞,直到信号值 大于或等于 sem_op的绝对值。通常用于获取资源的使用权;如果sem_op的值

4、为 0,则操作 将暂时阻塞,直到信号的值变为 0。 sem_flg :信号操作标志,可能的选择有两种 IPC_NOWAIT /对信号的操作不能满足时,semop()不会阻塞,并立即返回,同时设定错误信 息。 IPC_UNDO /程序结束时 ( 不论正常或不正常 ),保证信号值会被重设为semop()调用前的 值。这样做的目的在于避免程序在异常情况下结束时未将锁定的资源解锁,造成该资源永远 锁定。 2、 semop 函数 函数原型: int semop(int semid, struct sembuf *sops, unsigned nsops); 参数说明: semid:信号集的识别码,可通过

5、semget 获取。 sops:指向存储信号操作结构的数组指针。 nsops:信号操作结构的数量,恒大于或等于1。 返回说明:成功执行时,两个系统调用都返回0。失败返回 -1 ,错误信息保存在errno 中。 3、semget 函数 函数原型: int semget(key_t key,int nsems,int semflg); 参数说明: key:关键字值一般是由系统调用ftok()返回的 nsems :指出了一个新的信号量集中应该创建的信号量的个数 semflg :打开和存取操作与参数semflg 中的内容相关。 返回说明:如果成功,则返回信号量集的IPC 标识符。如果失败,返回 -1

6、,错误信息保存在 errno 中。 4、semctl 函数 函数原型: int semctl(int semid,int semnum,int cmd,union semun arg); 参数说明: senid :关键字值 semnum :信号量数目 cmd :要操作的具体命令 arg:semnu的一个联合类型的副本。 返回说明:返回值:如果成功,则为一个正数。如果失败,则为-1 。错误信息保存在 errno 中。 5、pthread_create函数 函数原型: int pthread_create(pthread_t *restrict tidp,const pthread_attr_t

7、*restrict attr,void*(*start_rtn)(void*),void *restrict arg); 参数说明: tidp :指向线程标识符的指针。 attr :用来设置线程属性。 第三个参数是线程运行函数的起始地址。 arg:运行函数的参数。六、 设计方案:1、定义两个数组当作两个邮箱int a_buf5,b_buf5;邮箱的容量为 5。 2、定义两个指针指向邮箱的顶部int a_buf_top=0,b_buf_top=0;初始时邮箱都为空 3、定义 semaphore_P和 semaphore_V两个函数实现 P.V 原语操作,用 P.V 原语实现进程的 互斥。 4、定

8、义发送和接收信息的函数,其中void * A_Send(void *arg)为 A发送信息, void * B_Send(void *arg)为 B发送信息, void *A_Receive(void *arg)为 A接收信息; void *B_Receive(void *arg)为 B接收信息。 5、调用创建线程函数,让上述四个函数并行运行。七、预计的实验结果:A_Receive()和 B_Receive ()分别接收 B_Send ()和 A_Send()发出的信息,发送的 信息和接受的信息应该一样。八、关键代码的分析:/* * P原语操作* */ int semaphore_P(int

9、sem_id) struct sembuf p; p.sem_num=0; p.sem_op=-1; p.sem_flg=SEM_UNDO; if(semop(sem_id, return 0; return 1; /* * V原语操作* */ int semaphore_V(int sem_id) struct sembuf v; v.sem_num=0; v.sem_op=1; v.sem_flg=SEM_UNDO; if(semop(sem_id, return 0; return 1; /* * A向 B发送信息* */ void * A_Send(void *arg) int i;

10、for(i=0;i #include #include #include #include #include #include #include #include int a_buf5,b_buf5; / 邮箱的容量为 5 int a_buf_top=0,b_buf_top=0;/假设初始时邮箱都为空 int sem_idAs,sem_idBs; / 例如 sem_idAs代表 A此时最多可以向B发送的邮件数 int sem_idAr,sem_idBr; / 例如 sem_idAr 代表 A此时邮箱中受到的邮件数 int a_mutex_semaphore,b_mutex_semaphore;

11、 / 互斥信号量/* * P原语操作* */ int semaphore_P(int sem_id) struct sembuf p; p.sem_num=0; p.sem_op=-1; p.sem_flg=SEM_UNDO; if(semop(sem_id, return 0; return 1; /* * V原语操作* */ int semaphore_V(int sem_id) struct sembuf v; v.sem_num=0; v.sem_op=1; v.sem_flg=SEM_UNDO; if(semop(sem_id, return 0; return 1; /* * A向

12、 B发送信息* */ void * A_Send(void *arg) int i; for(i=0;i10;i+) semaphore_P(sem_idAs); /P 操作 semaphore_P(a_mutex_semaphore); / 互斥 int number=rand(); / 随机数为发送的邮件 printf(“A send to B:%dn“,number); b_buf*b_top = num+;/邮箱 B中接收 A发送的邮件, (*b_top)+=1;/A向 B发送邮件, B的邮件数量加一 semaphore_V(a_mutex_semaphore); / 互斥 semap

13、hore_V(sem_idBr);/V操作 sleep(1); /* * A接收 B的信息* */ void *A_Receive(void *arg) int i; for( i=0;i10;i+ ) semaphore_P(sem_idAr);/P操作 semaphore_P(b_mutex_semaphore);/ 互斥 a_buf_top-=1;/A接收 B发送邮件, A的邮件数量减一 printf(“A receive from B:%dn“,a_bufa_buf_top); semaphore_V(b_mutex_semaphore); / 互斥 semaphore_V(sem_idBs);/V操作 sleep(1); /* * B向 A发送信息* */ void *B_Send(void *arg) int i; for(i=0;i10;i+) semaphore_P(sem_idBs); semaphore_P(b_mutex_semaphore); int number=rand(); printf(“B send to A:%dn“,number); a_bufa_buf_top=number; a_buf_top+=1; semaphore_V(b_mutex_semaphore); semaphore_V(sem_idAr); sleep(1); /*

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号