Linux-IPC进程间通信
interprocess communicate
为什么需要ipc ,进程空间都是独立。但是进程和进程之间有数据共享或交换的需求。
一、种类
1、古老的通信方式:
管道的底层实现是 队列。
1)无名管道
2)有名管道
3)信号
2、IPC对象通信
system v BSD suse fedora kernel.org
消息队列(用的相对少) 共享内存 信号量集
3、socket通信
网络通信
二、无名管道(匿名管道) unnamed pipe
无名管道 ==》 pipe ==》只能给有亲缘关系进程通信
管道的特性:
1、管道是 半双工的工作模式 , 实际编程使用,会当单工使用。
2、所有的管道都是特殊的文件不支持定位操作。如lseek->> fd fseek ->>FILE*
3、管道是特殊文件,读写(首选)使用文件IO ,open,read,write,close; 可选(标准io带缓存区) fgets,fread,fgetc,
管道容易发生的状态:
编程顺序:
创建管道 ==》fork ==》读写管道 ==》关闭管道
三、有名管道
有名管道 ===》 fifo ==》 可以给任意单机进程通信.有文件名称的管道。文件系统中可见
编程步骤:创建有名管道 ==》打开有名管道 ==》读写管道 ==》关闭管道 ==》卸载有名管道
特性:和匿名管道特性一致。 额外的, 如果有一端没有打开,则默认在open函数部分阻塞。
四、信号通信
1. 应用
异步通信。 通知机制。 随机事件
2. 信号发送和接收的过程
1) 根据需要(随机事件)发生信号。
2) linux 接收到信号发生请求,在pcb的链表中,查找对应的pid号(1000)
3) 找到对应进程后,使原来工作流程先暂停下,执行pcb 中,信号处理函数 对应下标的函数。
例如:如果发送 信号2 ,则调用handle2
4)当handle2 执行完毕后,原来进程的代码,继续运行。
3. 系统中对信号的说明和相关默认处理行为
man 7 signal
4. 信号相关函数
五、共享内存
由 system V (unix 操作系统) 提供一种进程间通信的方式。
1. 函数调用的步骤
key ==》申请对象 ==》映射对象 ==》读写对象 ==》撤销映射 ==》删除对象
2. 与管道相关区别
1)对于读写进程而言, 双方都可以读写
2)没有读阻塞
3)没有写阻塞。 共享内存需要和其他ipc(信号,或信号量集(同步操作)) 进行搭配使用
4)是一个初级内存区域 (像字符数组)
5)不删除数据,数据保持的
6)相对来说,共享内存空间可以自定义(4K *n ), 大空间