pipe---无名管道
mkfifo---有名管道
msgget ----用于创建一个新的或打开一个已经存在的消息队列,此消息队列与key相对应。
msgrcv 功能---从标识符为msqid的消息队列读取消息并存于msgp中,读取后把此消息从消息队列中删除。
msgsnd 功能---将msgp消息写入到标识符为msqid的消息队列。
进程间通信:
不同进程之间传数据、交换信息。
进程间方式:(重点)
- 管道(无名管道和命名管道)
- 消息队列
- 信号量
- 共享内存
- socket
- steams等。
其中socket 和 steams 支持不同主机上的两个进程通信。
pipe 管道(无名管道)
pipe 管道(无名管道)通常指无名管道,是Unix 系统 IPC最古老的形式。
头文件及原型
#include <unistd.h>
int pipe(int pipefd[2]);
特点半双工,只能要么接收数据,要么传输数据。一个读,一个写。 只能用于具有亲缘关系的进程通信,比如:父子进程。 可以看成是特殊文件,它读写可以使用 read、write等函数,但它不是普通文件和系统文件,它是只存在内存中的。
FIFO(命名管道)
FIFO(有名管道)有名管道也叫命名管道,在文件系统目录中存在一个管道文件。 管道文件仅仅是文件系统中的标示,并不在磁盘上占据空间。在使用时,在内存上开辟空间,作为两个进程数据交互的通道。
管道文件的创建 在shell中使用 mkfifo 命令 mkfifo filename mkfifo 函数 (在代码中使用其创建管道文件)
mkfifo 参数 pathname:文件名/文件路径
mode:权限 比如 0600 就是可读可写。
mkfifo 返回值
成功:则返回 0
失败:返回 -1 , 错误原因存于 errno 中.
mkFIFO使用:
write:
read: