转自:https://www.cnblogs.com/liugh-wait/p/8533003.html
进程通信概念
进程用户空间是相互独立的,一般而言不能相互访问。进程间的通信通过与内核及其他线程间的互相通信来协调。
进程通信的应用场景
1.数据传输
一个进程需要将他的数据发送给另一个进程,发送的数据在一个字节到几兆字节之间
2.共享数据
多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到
3。通知事件
一个进程需要向另一个或一组进程发送消息,通知他(他们)发生了某种事件.如进程终止时要通知父进程
4.资源共享
多个进程之间共享同样的资源,需要内核提供锁和同步机制
5.进程控制
有些进程希望完全控制另一个进程的执行
进程通信方式
1.管道(pipe)
普通管道pipe:通常有两种限制,一种是单工,只能单向传输,二是只能在父子或者兄弟进程间使用
流管道s_pipe:去除了第一种限制,为半双工传输,只能在父子或者兄弟进程间使用,可以双向传输
命名管道name_pipe:去除了第二种限制,可以在许多并不相关的进程间进行通讯
管道通信原理
管道是由内核管理的一个缓冲区。管道的一端连接一个进程的输入,这个进程会向管道中放入信息,管道的另一端连接一个进程的输出,取出被放入管道的信息。缓冲区不需要很大,被设计成环形结构,以便管道可以循环利用,当管道没有信息,从管道中读取的进程会等待,直到另一端进程放入信息。当管道被放满信息的时候,再次尝试放入信息会等待,直到另一端进程有取出信息。当两个进程都终结的时候,管道会自动消失。
管道的建立
利用fork机制,从而让两个进程可以连接到同一个pipe上。
2.信号量(semophore)
信号量是一个计数器,可以用来控制多个进程对共享资源的访问,常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,在任一时刻只能有一个执行线程访问代码的临界区域,临界区域是指执行数据更新的代码需要独占式的执行,而信号量则可以提供这种访问机制,让临界区同一事件只有一个线程在访问。
3.消息队列(message queue)
消息队列是由消息的链表,存放在内核中并有消息队列标识符的标识。克服了信号量传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
4.信号(signal)
信号是一种比较复杂的通信方式,用来通知接收进程某个事件已经发生。
5.共享内存(shared memory)
映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。是最快的IPC(进程间通信)方式,是针对其他进程间通信方式运行效率低而专门设计的,往往与信号量配合使用,实现进程间的同步和通信。
6.套接字(socket)
用来在不同机器间的进程通信