1.IPC Internal Processes Communication
进程间通信
进程间进行数据交换
可以直接定义一个全局变量?
不可以,因为进程间的地址空间是独立
所以 如果两个进程要进行通信,必须把数据放在一个
双方都可以访问地方
文件 可以
文件在文件系统(硬盘),大家都可以访问
但是速度太慢了
=》
在操作系统内核中开辟一块空间(某种机制),进程去访问它
IPC 方式
管道
pipe 无名管道
FIFO 有名管道
信号
signal
消息队列
System V消息队列/POSIX消息队列
信号量
System V 信号量/POSIX 信号量
共享内存
System V 共享内存/POSIX 共享内存
socket 通信:unix域协议
2.管道
很久以前 进程间通信确实依赖文件
这种方式速度实在太慢了
好处是 简单 直接使用文件IO的API函数就可以了
除了文件 OS的内存区域也是大家都可以通过OS去访问
能不能把通信的数据放在内核中呢?
管道:管道文件 虽然是个文件 但是内存是在内存中的
而且无名管道是没有Inode节点的
无名管道:内容在内核中 在文件系统中没有indoe节点(没有名字)
pipe 在创建是 在内核开辟了一块缓冲区 做位pipe的内容
的存储空间,同时返回两个文件描述符(一个用来读 一个用来写)
它有一下特点
(1)pipe有两端 一端是用来读 一端是用来写
(2)按顺序读,不支持lseek
(3)内容读走了 就没有了
(4)pipe(无名管道)随内核持续性
既然说管道是一个文件 意味着
可以通过系统IO去读写管道文件
open
read
write
close
open 不能去打开一个无名管道,open的第一参数就是文件名
没有名字怎么打开?
这个有一个新的API
pipe 创建一个无名管道
NAME
pipe, pipe2 - create pipeSYNOPSIS
#include <unistd.h>int pipe(int pipefd[2]);
int pipefd[2]:数组
pipefd[0] 保存读的文件描述符
pipefd[1] 保存写的文件描述符
返回值
成功返回0
失败返回 -1 同时errno被设置
思考
1.pipe是不是任意两个进程都可以用pipe通信?
或者只能用于父子进程间通信
原则上来说
只要两个进程能获取同意pipe的文件描述符
就可以用pipe进行通信
2.pipe本身是全双工!但是如果用一个管道去实现通信
就必须通过某种方式去同步 不然,就很有可能读到
自己写的数据!通常在工程中项目中,一般做成两个或
更多的管道来显现全双工
pipe 一般而言 只能用于有“亲缘关系”的进程通信
它为什么有这个限制?
pipe本身需要文件描述符去读写
但是没有名字 open函数用不了
那如果有一个名字
假设它在文件系统中有一个名字(inode),它就可以
轻松的用于任意间进程通信
fifo 有名管道
3.FIFO有名管道
fifo 是在 pipe 的基础上 在文件系统上创建了一个inode节点
注意! fifo的inode节点实在文件系统上面的,但是
它所有的内容都在内核中
fifo 的文件随文件系统持续性
fifo 的内容存在内核中的 随内核持续性
实质上 fifo和pipe没有区别 只不过是多了一个名字
一旦有了名字 就可以open了 fife的创建 mkfifo
NAME
mkfifo, mkfifoat - make a FIFO special file (a named pipe)SYNOPSIS
#include <sys/types.h>
#include <sys/stat.h>int mkfifo(const char *pathname, mode_t mode);
const char *pathname: 要创建fifo的文件名 带路径 不要创建在共享文件夹下 那是windows的文件系统
mode_t mode: 文件权限
1.S_IRUSR....
2.0666
返回值
成功返回0
失败返回-1,同时errno被设置