首页 > 代码库 > 2014025627 《嵌入式程序设计》第七周学习总结
2014025627 《嵌入式程序设计》第七周学习总结
教材学习内容总结
1.有名管道:
管道应用的一个重大限制是它没有名字,因此,只能用于具有亲缘关系的进程间通信,在有名管道(named pipe或FIFO)提出后,该限制得到了克服。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,如close、read、write等等。有名管道比管道多了一个打开操作: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:返回新的或已有队列的ID,IPC_PRIVATE
msgsnd()
添加消息,将消息添加到消息队列尾部。
int msgsnd (int msqid, struct msgbuf *msgp, size_t msgsz, int flag)
msqid是消息队列的队列ID,msgp是消息内容所在的缓冲区,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规定的队列要执行的命令。
在实验楼里运行程序时发生错误,后在虚拟机中运行时也发生错误,修改代码后成功运行。
2014025627 《嵌入式程序设计》第七周学习总结