提示:以下内容不保证对,只能个人在学习时的笔记。
通信方式:管道、消息队列、信号、信号量、共享内存、套接字
一、管道
1.管道是内核中的缓存,有大小限制linux中是4KB,无数据格式;
写满时,再写时写进程会被阻塞;管道为空时,读时会被阻塞;
管道中数据是一次性的,读完就被抛弃;
管道机制必须提供三方面的协调能力:互斥、同步、确定对方的存在。
2.单向传输,单工通信;先进先出
3.种类:
(1)匿名管道:只能用于父子进程间通信,存在于内存中
系统调用:int pipe(int fd[2]) 描述符 fd[0]用于读,fd[1]用于写,
父进程会关闭 fd[0],只保留写入的fd[1] ; 子进程会关闭fd[1], 只保留读取的fd[0]
使用时不用打开,用完要做关闭操作,close(fd[0]); close(fd[1]);
标准库调用:***
(2)命名管道:不同进程间都可相互通信,是文件系统中(在交换空间磁盘上)的一个设备(管道)文件。在文件系统中只有一个索引块存放文件的路径,没有数据块,数据块存在内核中
系统调用:mkfifo(char* pathname,mode_t mode)
fifo是一个文件,使用时要open,close,read,write,一般文件IO函数都可用
优点:简单,能够知道管道中的数据已经被另一个进程读取了
缺点:通信效率低,不适合进程间频繁通信
二、消息队列
1.是内核中的消息链表,以消息体为独立单位链接起来,消息队列的总长度有上限;
2.消息体有大小也有数据类型,数据类型由用户定义;
3.读完消息后,相应的消息体会被内核删除。
4.写数据和读数据时,存在用户态和内核态的系统开销
5.生命周期:没有释放消息队列或没关闭系统就一直在
优点:
缺点:通信不及时(我觉得是因为链表),附件也有大小限制
三、共享内存
1.共享内存是多个进程共享的一块物理内存,各进程的虚拟地址映射到该内存
2.对共享空间进行读写操作,必须使用同步互斥工具
优点:共享数据的最快方式
缺点:多个进程写同一个共享内存,会被覆盖
四、信号量
P、V操作
用于进程间同步互斥问题。
P操作,是减,减后<0,说明共享资源被占用,当前进程阻塞;
V操作,是加,加后当前进程<=0,说明当前有进程阻塞,就唤醒。
信号初始化为1,是互斥信号量;初始化为0,是同步信号量。
五、信号
对于异常情况下的工作模式,需要用信号的方式来通知进程。是唯一的异步通信方式。
用户进程对信号的处理方式:
1.默认方式处理
2.捕捉信号
3.忽略信号
六、套接字(socket)
不同主机间通信、同一主机间进程间通信
系统调用:int socket(int domain , int type, int protocal )
domain(协议族):AF_INET(IPV4), AF_INET6(IPV6), AF_LOCAL/AF_UNIX(本地)
type(通信类型); TCP通信类型SOCK_STREAM(字节流),UDP通信类型 SOCK_DGRAM(数据报), SOCK_RAM(原始套接字)
protocal: 0