首页 > 代码库 > 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 ;

                                表头文件:

          

                                                #include <sys/types.h>

               #include <sys/ipc.h>

                #include <sys/shm.h>

          函数说明: 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 嵌入式程序设计 第七周学习总结