学习内容
有名管道和消息队列的传输和接收,并且在课上和课下实验楼中进行了程序的验证和操作。
1.有名管道
有名管道可以将两个互不相关的进程实现彼此的通信,
可以通过路径名来指出,并且在文件系统中是可见的。
读进程
1.若管道是阻塞打开,且FIFO内无数据,则读进程一直堵塞下去,直到有数据写入。
2.不是阻塞打开,不管有没有数据,会立即执行。
写进程
阻塞打开,跟读进程一样,直到有东西写入
2.mkififo()函数
函数原型
int mkfifo( const char *pathname, mode_t mode );
参数:
可以看出这个函数有需要两个参数。
第一个参数在系统中创建一个文件。
第二个参数写FIFO权限。
返回值:
成功返回值为0。
失败返回值为-1。
注意:
对命名管道,除非写入方主动打开管道的读取端,否则读取方是无法打开命名管道的。
Open调用执行后,读取方将被锁住。
接收和发送是要在两个终端中进行的。首先要启动读管道,然后再启动写管道,如果读的时候没有启动,会一直阻塞。
3.msgget()函数:
作用:
被用来创建新的消息队列或获取已有的消息队列
函数原型
int msgget ( key_t key, int msgflg)
第一个参数:消息队列对象的关键字(key),函数将它与已有的消息队列对象的关键字进行比较来判断消息队列对象是否已经创建。
第二个参数:函数进行的具体操作。它可以有如下的值:IPC_CREAT:
如果消息队列对象不存在,则创建,否则则进行打开操作;IPC_EXCL:
(用”|”连接IPC_CREAT),如果消息对象不存在则创建之,否则产生一个错误并返回。
返回值:
成功:消息队列ID号
失败:-1
4.msgctl()函数
作用:
msgctl()函数,我们可以直接控制消息队列的行为。
函数原型:
int msgctl ( int msgqid, int cmd, struct msqid_ds *buf )
第一个参数:是消息队列对象的标识符。
第二个参数:是函数要对消息队列进行的操作。
操作方式有如下:IPC_STAT
:取出系统保存的消息队列的msqid_ds
数据,并将其存入参数buf
指向的msqid_ds
结构中。IPC_SET
:设定消息队列的msqid_ds
数据中的msg_perm
成员。设定的值由buf
指向的msqid_ds
结构给出。IPC_EMID
:将队列从系统内核中删除。
返回值:
成功:0
失败:-1