Linux 编程 —— 进程间的通信 <管道、消息队列、共享内存、套接字、信号量、信号>(汇总 + 实例)

文档声明:
以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正。并且该文档在后期会随着学习的深入不断补充完善。感谢各位的参考查看。


笔记资料仅供学习交流使用,转载请标明出处,谢谢配合。
如果存在相关知识点的遗漏,可以在评论区留言,看到后将在第一时间更新。
作者:Aliven888

1. 为什么需要进程间通信?

进程的数据空间是独立的,私有的,不能相互访问,但是在某些情况下进程之间需要通信来实现某功能或交换数据,包括:

1)数据传输:一个进程需要将它的数据发送给另一个进程。

2)共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。

3)通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如通知进程退出)。

4)进程控制:一个进程希望控制另一个进程的运行。

2. 进程通信的方式

2.1、 管道(pipe)

管道 —— 包括无名管道(pipe)及命名管道(named pipe),无名管道可用于具有父进程和子进程之间的通信。命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。

2.2、 消息队列(message)

消息队列 —— 进程可以向队列中添加消息,其它的进程则可以读取队列中的消息。

Linux 编程 —— 进程间的通信 之 消息队列(zmq socket 学习笔记)

2.3、 共享内存(share memory)

共享内存 —— :多个进程可以访问同一块内存空间。

详细可以参考这边文章:

C/C++ linux 实现共享内存(share memory)的读写操作【代码实例】

C/C++ boost 库实现共享内存(share memory)的读写操作【代码实例】

2.4、 套接字(socket)

套接字 —— 可用于不同计算机之间的进程间通信。

Linux 编程 —— 进程间的通信 之 消息队列(zmq socket 学习笔记)

linux 编程 ———网络编程(Socket 编程)客户端与服务端实现源码

2.5、 信号量(semaphore)

信号量 —— 也叫信号灯,用于进程之间对共享资源进行加锁。

2.6、 信号 (signal)

信号 —— 信号用于通知其它进程有某种事件发生。

kill -l # 查看 linux 系统中的全部信号。

Linux 编程 —— 进程间的通信 <管道、消息队列、共享内存、套接字、信号量、信号>(汇总 + 实例)_第1张图片

3、总结

1)管道和消息队列太过时了,实在没什么应用价值,了解概念就行。

2)socket主要用于不同系统之间的进程通信,也完全可以代替只能在同一系统中进程之间通信的管道和消息队列。

3)信号的应用场景非常多,主要用于进程的控制,例如通知正在运行中的后台服务程序退出。

4)同一系统中,进程之间采用共享内存交换数据的效率是最高的,但是,共享内存没有加锁的机制,所以经常与信号灯结合一起来使用,在高性能的网络服务端程序中,可以用共享内存作为的数据缓存(cache)。

5)在企业IT系统内部,消息队列已经逐渐成为通信的核心手段,它具有低耦合、可靠投递、广播、流量控制、一致性等一系列功能。当今市面上有很多主流的消息中间件有Redis、RabbitMQ、Kafka、ActiveMQ、ZeroMQ,阿里巴巴自主开发RocketMQ等。

你可能感兴趣的:(Linux,C/C++,linux,C++,多进程,通信)