15欧小诗

2014025641(15)《嵌入式系统程序设计》第七周学习总结

2014025641(15)《嵌入式系统程序设计》第七周学习总结#

学习内容概要###

本周我们学习了,有名管道和消息队列的传输和接收,并且在课上和课下实验楼中进行了程序的验证和操作。
下面把一些不理解或者有问题的知识点和注意事项总结一下。

有名管道###

有名管道的比无名管道的优势在哪
无名管道只能具有亲缘关系的进程之间传输,这样就很有局限性了。然而有名管道可以将两个互不相关的进程实现彼此的通信。
可以通过路径名来指出,并且在文件系统中是可见的。注意:FIFO是严格遵循先进先出的。

(1)对于读进程
1.若管道是阻塞打开,且FIFO内无数据,则读进程一直堵塞下去,直到有数据写入。
2.不是阻塞打开,不管有没有数据,会立即执行。
(2)对于些进程
1.阻塞打开,跟读进程一样,直到有东西写入。

mkififo()函数###

Mkfifo函数原型如下所示:
int mkfifo( const char *pathname, mode_t mode );
参数:
可以看出这个函数有需要两个参数。
第一个参数在系统中创建一个文件。
第二个参数写FIFO权限。
返回值:
成功返回值为0。
失败返回值为-1。
FIFO出错信息归纳:

我们的实验中程序半段的事第二种报错方式(文件是否存在)
值得注意的是:
对命名管道,除非写入方主动打开管道的读取端,否则读取方是无法打开命名管道的。
Open调用执行后,读取方将被锁住。
接收和发送是要在两个终端中进行的。首先要启动读管道,然后再启动写管道,如果读的时候没有启动,会一直阻塞。

消息队列###

概念:
用户可以从消息队列中添加消息和读取消息,具有一定的FIFO特性,但它可以实现消息的随即查询,有队列ID标识。
这些消息存在于内核中。

msgget()函数###

作用:
msgget()被用来创建新的消息队列或获取已有的消息队列
msgget函数原型:
int msgget ( key_t key, int msgflg)
第一个参数:消息队列对象的关键字(key),函数将它与已有的消息队列对象的关键字进行比较来判断消息队列对象是否已经创建。
第二个参数:函数进行的具体操作。它可以有如下的值:
IPC_CREAT:如果消息队列对象不存在,则创建,否则则进行打开操作;
IPC_EXCL:(用”|”连接IPC_CREAT),如果消息对象不存在则创建之,否则产生一个错误并返回。
返回值:
成功:消息队列ID号
失败:-1

msgsnd()函数和msgrcv()函数###

作用:
msgrcvmsgsnd异步或进程间通信的一种机制,这两个函数主要用于操作特定的消息队列。msgrcv()可以从消息队列中读取消息,msgsnd()将一个新的消息写入队列。
msgget函数原型:
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg)
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg)
第一个参数:消息队列的识别码。
第二个参数:指向消息缓冲区的指针,暂时存储发送和接收的消息。
第三个参数:消息的大小。
第四个参数:消息类型。
第五个参数:控制函数。
返回值:
成功:0
失败:-1

msgctl()函数###

作用:
msgctl()函数,我们可以直接控制消息队列的行为。
msgctl函数原型:

int msgctl ( int msgqid, int cmd, struct msqid_ds *buf )
第一个参数:是消息队列对象的标识符。
第二个参数:是函数要对消息队列进行的操作。
操作方式有如下:
IPC_STAT:取出系统保存的消息队列的msqid_ds数据,并将其存入参数buf指向的msqid_ds结构中。
IPC_SET:设定消息队列的msqid_ds数据中的msg_perm成员。设定的值由buf指向的msqid_ds结构给出。
IPC_EMID:将队列从系统内核中删除。
返回值:
成功:0
失败:-1

学习心得###

本周学习了很多东西,遇见了很多函数。在博客中深入的了解了各个函数原型和参数的意义,并通过在实验楼中的操作加深印象。
了解了消息对列和有名管道的用法。在实验中存在的问题就是总忘给结构体最后加一个;,可能是对这方面知识了解的不够扎实,有待
回头复习一下结构体知识。

posted on 2017-06-03 08:04  欧小诗  阅读(135)  评论(0编辑  收藏  举报

导航