2014025684(26) 《嵌入式系统程序设计》第七周学习总结
管道创建与关闭说明
创建管道可以通过调用pipe()来实现
管道关闭时只需将这文件描述符关闭即可,可使用普通的close()函数逐个关闭各个文件描述符。
管道读写说明
使用管道进行父子进程间通信的步骤:
创建管道:父进程调用pipe()函数创建一个管道
此时,管道的读端和写端都在一个进程之中,这种管道是没有多大用的。
父进程通过fork()函数创建一子进程
子进程会继承父进程所创建的管道,这时,父子进程中管道的文件描述符对应关系如图8.4所示。
确定管道的传输方向:在父、子进程中根据需要的传输方向关闭无关的读端或写端文件描述符
通信:在写进程中调用write()函数,在读进程中调用read()函数
关闭管道:调用close()关闭管道相关的文件描述符。
一 无名管道
1 无名管道的特点
1)只能用于具有亲缘关系的进程之间,父子进程,兄弟进程之间通信,因为只有子进程才能继续父进程的文件描述符。
2)半双共通信(同一时刻只能对管道进行一种操作(读操作或者写操作)),具有读端口和写端口。
3)管道是一种特殊的文件,可以使用文件io函数(read,write...)来操作,但不能使用lseek函数来定位操作。
4)管道是在内存中,不用我们主动区删除。
5)管道是基于队列实现的,有大小限制。
二 有名管道:
FIFO 是严格地遵循先进先出规则的,对管道及 FIFO 的读总是从开始处返回数据,对它们的写则把数据添加到末尾,它们不支持如 lseek()等文件定位操作。
有名管道的创建可以使用函数 mkfifo(),该函数类似文件中的 open()操作,可以指定管道的路径和打开的
模式。
创建管道成功之后,就可以使用 open()、 read()和 write()这些函数了
( 1)对于读进程。
若该管道是阻塞打开,且当前 FIFO 内没有数据,则对读进程而言将一直阻塞到有数据写入。
若该管道是非阻塞打开,则不论 FIFO 内是否有数据,读进程都会立即执行读操作。即如果 FIFO
内没有数据,则读函数将立刻返回 0。
( 2)对于写进程。
若该管道是阻塞打开,则写操作将一直阻塞到数据可以被写入。
若该管道是非阻塞打开而不能写入全部数据,则读操作进行部分写入或者调用失败。
open():打开函数;read()读取函数;write()写函数;close()关闭函数;
读进程:
若管道是阻塞打开,且当前FIFO内没有数据,则对读进程而言将一直阻塞到有数据写入。
若该管道是非阻塞打开的,则不论FIFO内是否有数据,读进程都会立即执行读操作。即如果FIFO内没有数据,则读函数讲立即返回0;
写进程:
若该管道是阻塞打开,则写操作讲一直阻塞到数据可以被写入;
若改管道是非阻塞打开而不能写入全部数据,则读操作进行部分写入或调用失败。
消息对列:消息对列的实现包括创建或打开对列、添加信息、读取信息、控制信息4种操作。
msgget():创建或打开对列,创建的消息对列数量会收到系统消息对列的限制;
msgsnd():添加函数,把消息添加到已打开消息对列末尾;
msgrcv():读取函数,把消息从消息对列种取走,可以指定取走某一种消息;
msgctl():控制函数,可以完成多项功能;
浙公网安备 33010602011771号