gg = shiftg快速对齐
加锁顺序问题时,如果解锁了,两个同时申请抢锁,谁抢到了运行谁,循环迭代时释放锁也是同时申请锁,循环部分如果没抢到锁就进入循环等待
总结:
IPC 进程间通信 interprocess communicate
//signal
三大类:
1.同主机 ---- 基于内存的
古老的通信方式
//管道 ----
无名管道
有名管道
//信号
IPC对象通信(改进)
消息队列(用的相对少,这里不讨论)
共享内存(*) //最高效
信号量集() //信号量
2.不同主机
socket //网络部分
//同一主机
1、古老的通信方式
管道:
无名管道
有名管道
信号
2、IPC对象通信 system v BSD suse fedora kernel.org
消息队列(用的相对少,这里不讨论)
共享内存(*) //最高效
信号量集() //信号量
//不同主机
3、socket通信
网络通信
【原理】:
+-进程A-+ +-进程B-+ <--
| | | | ^
| | | | |
| | | | 0~3G
| | | |
| | | | |
| | | | |
| | | | V
+------------------------------+ --
| 内核 | 1G
+------------------------------+ <----
//举例:
线程信号:
posix sem_init
特列:
古老的通信方式中,信号是唯一的异步通信
所有的通信方式中,共享内存是最高效的
管道==》无名管道、有名管道
无名管道 ===》pipe ==》只能给有亲缘关系进程通信
有名管道 ===》fifo ==》可以给任意单机进程通信(同一主机内)
管道的特性:
1、管道是 半双工的工作模式
2、所有的管道都是特殊的文件不支持定位操作。
lseek->> fd fseek ->>FILE*
数据流 --- FIFO(first in first out)
3、管道是特殊文件,读写使用文件IO。
fgets,fread,fgetc,
open,read,write,close;;
单 工 广播
半双工 对讲机
全双工 电话
-----
亲缘关系
读端存在,做写
管道空,随便写
管道满,写阻塞
读端不存在,做写
管道破裂,SIGPIPE
写端存在,做读
管道中有数据,则读取数据,最终把数据读完
管道中没有数据,则读操作阻塞
写端不存在,做读
管道中有数据,则读取数据,最终把数据读完
管道中没有数据,则读操作不阻塞,立即返回
1.读端存在,一直向管道中去写,超过64k,写会阻塞。
2.写端是存在的,读管道,如果管道为空的话,读会阻塞。
3.管道破裂,,读端关闭,写管道。
管道的读写规则:
1.读端存在,写管道
管道空:可以写数据
管道满:会造成-->写阻塞
2.读端不存在,写管道
系统会给进程发一个信号SIGPIPE(管道破裂)
3.写端存在,读管道
管道空,读不到数据,
这时会造成读操作阻塞
4.写端不存在,读管道
如果管道中有数据,则读取这些数据!
如果没有数据,读操作不阻塞,立即返回!
---------------
"hello pipe!"
---------------
//
使用框架:
创建管道 ==》读写管道 ==》关闭管道
1、无名管道 ===》管道的特例 ===>pipe函数
特性:
1.1 亲缘关系进程使用
1.2 有固定的读写端
流程:
创建并打开管道: pipe函数
#include <unistd.h>
int pipe(int pipefd[2]);
int pipe(int *pipefd);
int fd[2];
功能:创建并打开一个无名管道
参数:pipefd[0] ==>无名管道的固定读端//0 -- 标准输入
pipefd[1] ==>无名管道的固定写端//1 -- 标准输出
返回值:成功 0
失败 -1;
注意事项:
1、无名管道的架设应该在fork之前进行。
无名管道的读写:===》文件IO的读写方式。
读: read() //能否标准IO的操作?
写: write()
关闭管道: close();