管道、消息队列、共享内存、信号量、信号、socket
要知道管道、消息队列、共享内存的本质:内存本质、效率以及传输数据要求,各种使用方式
一、管道
管道通信效率低,不适合进程间频繁地交换数据。好处,简单,很容易得知已被另一进程读
匿名管道,通信范围存在父子关系进程。没有管道文件,只能 fork 复制父进程 fd 文件描述符来通信
命名管道,不相关进程间也能相互通信。因为命令管道,提前创建管道类型设备文件,只要用这个文件,就可通信
相同:都在缓存内核中读写,先进先出,不支持 lseek 之类文件定位操作
1、匿名管道
$ ps auxf | grep mysql 用完就销毁
|就是一个管道,将前一个命令(ps auxf)输出,作为后一命令(grep mysql)输入,管道传数据是单向,如相互通信,要两个
2、命名管道FIFO
$ mkfifo myPipe(名) 用前要mkfifo 命令创建,指定管道名,数据先进先出
1)基于“Linux一切皆文件”,管道也文件,ls 看,文件类型是 p,就是 pipe(管道) 意思
2)往 myPipe 写入数据:因为内容没被读,只有读后,命令才正常退出
3)读出了,echo 命令正常退出
3、创建原理
1)匿名管道创建, 通过 int pipe(intfd[2]) 系统调用:
两个描述符:管道读取端 fd[0],写入端 fd[1]。ps:匿名管道是特殊文件,只在内存,不存文件系统
2)管道,就是内核里一串缓存。读写都在缓存内核中,传数据是无格式的流且大小受限
3)跨进程通信实现:fork 创建子进程,复制父进程文件描述符,两个进程各有两个「 fd[0] 与 fd[1]」,通过各自fd 读写同一管道文件