首页 > 代码库 > 2014025689 嵌入式程序设计 第七周学习总结
2014025689 嵌入式程序设计 第七周学习总结
嵌入式程序设计 第七周
第七周课程主要学习了有名管道和消息队列的传输和接收。
一丶有名管道
有名管道和无名管道的区别:
1. 有名管道定义:可以使互不相关的两个进程实现彼此通信的管道就是有名管道。
有名管道可以通过路径名来指出,并且在文件系统中是可见的。在建立了管道之后,两个进程就可以把它当作普通文件一样进行读写操作,使用非常方便。不过值得注意的是,FIFO 是严格地遵循先进先出规则的,对管道及 FIFO 的读总是从开始处返回数据,对它们的写则把数据添加到末尾,它们不支持如 lseek()等文件定位操作。
有名管道的创建可以使用函数 mkfifo(),该函数类似文件中的 open()操作,可以指定管道的路径和打开的。
模式。
- FIFO的打开规则:
1.如果当前打开操作是为读而打开FIFO时,若已经有相应进程为写而打开该FIFO,则当前打开操作将成功返回;否则,可能阻塞直到有相应进程为写而打开该FIFO(当前打开操作设置了阻塞标志);或者,成功返回(当前打开操作没有设置阻塞标志)。
2.如果当前打开操作是为写而打开FIFO时,如果已经有相应进程为读而打开该FIFO,则当前打开操作将成功返回;否则,可能阻塞直到有相应进程为读而打开该FIFO;或者,返回ENXIO错误。
- 从FIFO中读取数据:
1. 如果当前打开操作是为读而打开FIFO时,若已经有相应进程为写而打开该FIFO,则当前打开操作将成功返回;否则,可能阻塞直到有相应进程为写而打开该FIFO(当前打开操作设置了阻塞标志);或者,成功返回(当前打开操作没有设置阻塞标志)。
2.造成阻塞的原因有两种:
(1)FIFO内有数据,但有其它进程在读这些数据
(2)FIFO内没有数据。解阻塞的原因则是FIFO中有新的数据写入,不论信写入数据量的大小,也不论读操作请求多少数据量。
- 有名管道的创建
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
该函数的第一个参数是一个普通的路径名,也就是创建后FIFO的名字。第二个参数与打开普通文件的open()函数中的mode 参数相同。如果mkfifo的第一个参数是一个已经存在的路径名时,会返回EEXIST错误,所以一般典型的调用代码首先会检查是否返回该错误,如果确实返回该错误,那么只要调用打开FIFO的函数就可以了。一般文件的I/O函数都可以用于FIFO,如close、read、write等等。
mkfifo()函数:相关函数: pipe,popen,open,umask ;
表头文件:
函数说明: mkfifo()会依参数pathname建立特殊的FIFO文件,该文件必须不存在,而参数mode为该文件的权限(mode%~umask),因此 umask值也会影响到FIFO文件的权限。Mkfifo()建立的FIFO文件其他进程都可以用读写一般文件的方式存取。当使用open()来打开 FIFO文件时,O_NONBLOCK旗标会有影响
返回值:若成功则返回0,否则返回-1,错误原因存于errno中。
FIFO相关出错信息:
管道参数mkfifo()函数格式
O_RDONLY:读管道
O_WRONLY:写管道
O_RDWR:读写管道
O_NONBLOCK:非阻塞 等一系列传入值与返回值。
首先启动读管道程序。 读管道进程在建立管道之后就开始循环地从管道里读出内容,如果没有数据可读,则一直阻塞到写管道进 程向管道写入数据。 在启动了写管道程序后,读进程能够从管道里读出用户的输入内容。
二、消息队列
1、消息队列定义:
顾名思义,消息队列就是一些消息的列表。用户可以从消息队列中添加消息和读取消息等。从这点上看,消息队列具有一定的 FIFO 特性,但是它可以实现消息的随机查询,比 FIFO 具有更大的优势。同时,这些消息又是存在于内核中的,由“队列 ID”来标识。
2、消息队列的实现
消息队列的实现包括创建或打开消息队列、添加消息、读取消息和控制消息队列这 4 种操作。其中创建或打开消息队列使用的函数是 msgget(),这里创建的消息队列的数量会受到系统消息队列数量的限制;添加消息使用的函数是 msgsnd()函数,它把消息添加到已打开的消息队列末尾;读取消息使用的函数是msgrcv(),它把消息从消息队列中取走,与 FIFO 不同的是,这里可以指定取走某一条消息;最后控制消息队列使用的函数是 msgctl(),它可以完成多项功能。
具体实现操作:
-创建或打开消息队列:使用的函数是msgget(),这里创建的消息队列的数量会受到系统消息队列数量的限制。
-.添加消息:使用的函数是msgsnd(),它把消息添加到已打开的消息队列末尾。
-读取消息:使用的函数是msgrcv(),它把消息从消息队列中取走,与FIFO不同的是,这里可以取走指定的某一条消息。
-控制消息队列:使用的函数是msgctl(),它可以完成多项功能。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 |
---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 |
第一周 | 100/100 | 1/1 | 5/5 |
第二周 | 200/300 | 1/2 | 5/10 |
第三周 | 300/600 | 0/2 | 1/11 |
第四周 | 600/1200 | 1/3 | 4/15 |
第五周 | 200/1400 | 1/4 | 4/19 |
第六周 | 200/1600 | 0/4 | 4/13 |
第七周 | 600/2200 | 1/5 | 4/17 |
学习收获:有名管道和消息队列的传输和接收,并且在课上和课下实验楼中进行了程序的验证与操作。
2014025689 嵌入式程序设计 第七周学习总结