本周学习了进程间通信这一章,首先管道:
管道是基于文件描述符的通信方式,当一个管道建立时,它会创建两个文件描述符 fds[0]和 fds[1],其中 fds[0]
固定用于读管道,而 fd[1]固定用于写管道,如图所示,这样就构成了一个半双工的通道。
无名管道,它具有如下特点。
它只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间)。
它是一个半双工的通信模式,具有固定的读端和写端。
管道也可以看成是一种特殊的文件,对于它的读写也可以使用普通的 read()和 write()等函数。但
是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内核的内存空间中。
有名管道:
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():控制函数,可以完成多项功能;