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

管道

管道:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
有名管道: 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

FIFO不同于无名管道之处在于它提供了一个路径名与之关联,以FIFO的文件形式存在于文件系统中,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信,因此,通过FIFO不相关的进程也能交换数据。值的注意的是,FIFO严格遵循先进先出,对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾。它们不支持诸如lseek()等文件定位操作。有名管道的名字存在于文件系统中,内容存放在内存中。

管道的特殊性,无法在单一进程里进行读写,只能在一个进程里写,另外一个进程里读。

mkfifo()函数 返回值 成功:0 出错:-1
传入值 mode: O_RDONLY:读管道
O_WRONLY:写管道
O_RDWR:读写管道
O_NONBLOCK:非阻塞 等一系列传入值与返回值。
memset警告 要加上头文件:include string.h

消息队列

消息对列:消息对列的实现包括创建或打开对列、添加信息、读取信息、控制信息4种操作。
msgget():创建当前进程的私有消息队列;
key:消息队列对象的关键字(key),函数将它与已有的消息队列对象的关键字进行比较来判断消息队列对象是否已经创建。

msgsnd():添加函数,把消息添加到已打开消息对列末尾;
msgsz:消息正文的字节数;msgflg 0 调阻塞直到发送成功为止;

msgrcv():读取函数,把消息从消息对列种取走,可以指定取走某一种消息;
msqid:消息队列的队列ID msgp:消息缓冲区 msgp msgsz:消息正文的字节数

msgctl():控制函数,可以完成多项功能;
msgqid是消息队列对象的标识符。
cmd是函数要对消息队列进行的操作。
操作方式IPC_STAT:取出系统保存的消息队列的msqid_ds数据,并将其存入参数buf指向的msqid_ds结构中。
IPC_SET:设定消息队列的msqid_ds数据中的msg_perm成员。设定的值由buf指向的msqid_ds结构给出。
IPC_EMID:将队列从系统内核中删除。

其他

本周实验楼的代码中学习到了有名管道的双端口读写和消息队列的打开,添加,读取等作用的运用。

posted on 2017-06-13 20:57  gaojieshun  阅读(119)  评论(0编辑  收藏  举报

导航