linux进程间通信(IPC)小结

原文地址:https://www.jianshu.com/p/c1015f5ffa74

linux IPC类型

1、匿名管道
2、命名管道
3、信号
4、消息队列
5、共享内存
6、信号量
7、Socket

1、匿名管道

在这里插入图片描述
过程:
1、管道实质是一个内核缓冲区,先进先出(队列)读取缓冲区内存数据
2、一个数据只能读一次,读完后在缓冲区就不存在了。
3、当缓冲区读空或者写满时,相应的读进程或者写进程会进入等待队列,在有新数据写入或者有数据被读出来时,就唤醒等待队列中的进程。

特点:
1、只支持单向数据流(两个进程如果要双向读写,需要创建两个管道)
2、只能用于具有亲缘关系的进程之间
3、缓冲区大小有限
4、传输的是无格式字节流,收发方需要约定格式。
5、内容都存于内存中。

2、命名管道

过程和匿名管道类似。
它提供了一个路径名与之关联,以有名管道的文件形式存在于文件系统中,这样,即使与有名管道的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过有名管道相互通信。

特点:
1、只支持单向数据流
2、能用于任意两个进程之间通信(和匿名管道区别)
3、缓冲区大小有限
4、传输的是无格式字节流,收发方需要约定格式。
5、有名管道的名字存在于文件系统中,内容存放在内存中。(和匿名管道区别)

3、信号

信号是软件层次上对中断机制的一种模拟,是一种异步通信方式,信号可以在用户空间进程和内核之间直接交互,内核可以利用信号来通知用户空间的进程发生了哪些系统事件,信号事件主要有两个来源:
1、硬件来源:用户按键输入Ctrl+C退出、硬件异常如无效的存储访问等。
2、软件终止:终止进程信号、其他进程调用kill函数、软件异常产生信号。

Linux系统中常用信号:
(1)SIGHUP:用户从终端注销,所有已启动进程都将收到该进程。系统缺省状态下对该信号的处理是终止进程。
(2)SIGINT:程序终止信号。程序运行过程中,按Ctrl+C键将产生该信号。
(3)SIGQUIT:程序退出信号。程序运行过程中,按Ctrl+\\键将产生该信号。
(4)SIGBUS和SIGSEGV:进程访问非法地址。
(5)SIGFPE:运算中出现致命错误,如除零操作、数据溢出等。
(6)SIGKILL:用户终止进程执行信号。shell下执行kill -9发送该信号。
(7)SIGTERM:结束进程信号。shell下执行kill 进程pid发送该信号。
(8)SIGALRM:定时器信号。
(9)SIGCLD:子进程退出信号。如果其父进程没有忽略该信号也没有处理该信号,则子进程退出后将形成僵尸进程。

4、消息队列

消息队列是存放在内核中的消息链表。进程可以通过发送消息和接收消息来进程通信,同样遵守先进先出的原则。
类比于,ios中dispatch的queue,android中MessageQueue。

特点:
1、消息队列也独立于发送和接收进程而存在。可以多个进程之间通信。
2、避免管道的同步和阻塞问题,不需要进程自己来控制同步操作。
3、接收程序可以通过消息类型有选择地接收数据,而不是像命名管道中那样,只能默认地先进先出的接收。

5、共享内存

为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间。进程就可以直接读写这一块内存而不需要进行数据的拷贝,从而大大提高效率。

特点:
1、是最快的可用IPC形式,是针对其他通信机制运行效率较低而设计的。
2、由于多个进程共享一段内存,因此需要依靠某种同步机制(如信号量)来达到进程间的同步及互斥。

6、信号量

信号量是一个计数器,用于多进程对共享数据的访问,信号量的意图在于进程间同步
为了获得共享资源,进程需要执行下列操作:
(1)创建一个信号量: 这要求调用者指定初始值,对于二值信号量来说,它通常是1,也可是0。
(2)等待一个信号量: 该操作会测试这个信号量的值,如果小于0,就阻塞。也称为P操作。
(3)挂出一个信号量: 该操作将信号量的值加1,也称为V操作。

信号量与互斥量之间的区别:
互斥量值只能为0/1,信号量值可以为非负整数。
也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量是,也可以完成一个资源的互斥访问。

7、Socket

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Double2hao/article/details/82843756