2014025627 《嵌入式程序设计》第七周学习总结

教材学习内容总结

1.有名管道:

管道应用的一个重大限制是它没有名字,因此,只能用于具有亲缘关系的进程间通信,在有名管道(named pipeFIFO)提出后,该限制得到了克服。FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中。这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程以及FIFO的创建进程之间)。因此,通过FIFO不相关的进程也能交换数据。值得注意的是,FIFO严格遵循先进先出(first in first out),对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾。

有名管道的创建:

#include <sys/types.h>

#include <sys/stat.h>

int mkfifo(const char * pathname, mode_t mode)

该函数的第一个参数是一个普通的路径名,也就是创建后FIFO的名字,第二个参数与打开普通文件的open()函数中的mode参数相同,如果mkfifo的第一个参数是一个已经存在的路径名时,会返回EEXIST错误,所以一般典型的调用代码首先会检查是否返回该错误,如果确实返回该错误,那么只要调用打开FIFO的函数就可以了。一般文件的I/O函数都可以用于FIFO,如closereadwrite等等。有名管道比管道多了一个打开操作:open

mkfifo()函数语法要点

FIFO相关的出错信息

write()函数功能:buf中的count字节内容写入文件描述符fd.成功时返回写的字节数.失败时返回-1. 并设置errno变量.

          参数:fd:文件描述词

                                   buf:内存缓冲

                                   count:数据量 

read()函数功能:负责从fd中读取内容.成功时,read返回实际所读的字节数,如果返回的值是0,表示已经读到文件的结束了,小于0表示出现了错误。

          参数:fd:将要读取数据的文件描述词

                                  buf:  所读取到的数据的内存缓冲

                                  count: 需要读取的数据量

access()函数功能:检查调用进程是否可以对指定的文件执行某种操作。

           参数:pathname:需要检测的文件路径名

                                      mode:需要的操作模式

memset()函数功能:清空一个结构类型的变量或数组

           参数:buffer:为指针或是数组

                                      count:是buffer的长度

2.消息队列:

消息队列就是消息的一个链表,它允许一个或多个进程向它写消息,一个或多个进程从中读消息。具有一定的FIFO的特性,但是可实现消息的随即查询。这些消息存在于内核中,由“队列ID”来标识。消息队列的实现包括创建和打开队列、添加消息、读取消息和控制消息队列这四种操作。

msgget()

创建和打开队列,其消息数量受系统限制。

 int msgget (key_t key, int flag)

 key:返回新的或已有队列的IDIPC_PRIVATE

msgsnd()

添加消息,将消息添加到消息队列尾部。

 int msgsnd (int msqid, struct msgbuf *msgp, size_t msgsz, int flag)

 msqid是消息队列的队列IDmsgp是消息内容所在的缓冲区,msgsz是消息的大小,msgflg是标志,IPC_NOWAIT若消息并没有立交发送而调用进程会立即返回。

 struct msgbuf

 {

   long mtype; /* type of message */

   char mtext[1]; /* message text */

msgrcv()

读取消息,从消息队列中取走消息。

 int msgrcv (int msqid, struct msgbuf *msgp, size_t msgsz,long msgtyp, int flag)

 msqid是消息队列的引用标识符,msgp是接收到的消息将要存放的缓冲区,msgsz是消息的大小,msgtyp是期望接收的消息类型,msgflg是标志。

msgctl()

控制消息队列。

 int msgctl (int msqid, int cmd, struct msqid_ds *buf)

 msqid是消息队列的引用标识符,cmd是执行命令,buf是一个缓冲区,cmd参数指定对于由msqid规定的队列要执行的命令。

在实验楼里运行程序时发生错误,后在虚拟机中运行时也发生错误,修改代码后成功运行。

posted @ 2017-06-09 21:45  王一然  阅读(146)  评论(0编辑  收藏  举报