进程间通信(IPC)机制总结
创作时间:
作者:
@小白创作中心
进程间通信(IPC)机制总结
引用
CSDN
1.
https://blog.csdn.net/suifengme/article/details/140752297
进程间通信(Inter-Process Communication, IPC)是操作系统中一种使不同进程能够交换数据和同步执行的重要机制。本文将详细介绍各种IPC机制的详细说明、作用、适用场景及相关的API。
管道(Pipes)
说明
- 匿名管道:只允许有亲缘关系的进程(通常是父进程与子进程)之间进行通信,是一个半双工的通信方式。
- 命名管道 (FIFO):可以在不相关的进程之间使用,支持双向通信。
作用
- 用于简单的数据传递,如从一个进程向另一个进程传递数据流。
适用场景
- 当进程间只需要简单地传递少量数据时,使用管道非常有效。
- 命名管道可以在没有亲缘关系的进程之间进行通信,适合于构建复杂的管道链。
API
pipe(int pipefd[2])
:创建一个匿名管道。mkfifo(const char *pathname, mode_t mode)
:创建一个命名管道。open(const char *pathname, int flags)
:打开一个命名管道。write(int fd, const void *buf, size_t count)
:向管道写入数据。read(int fd, void *buf, size_t count)
:从管道读取数据。unlink(const char *pathname)
:删除命名管道。
消息队列(Message Queues)
说明
- 消息队列是在内核中维护的一个消息缓冲区,允许一个进程向另一个进程发送消息。
- 每条消息都有一个类型,可以按照类型来接收消息。
作用
- 提供了一种更为灵活的消息传递机制,支持消息的优先级和类型。
适用场景
- 当需要在进程间传递结构化的数据,且数据量不大时。
- 在多进程环境中需要按顺序或基于类型处理消息的情况。
API
msgget(key_t key, int flag)
:创建或获取一个消息队列。msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg)
:发送一条消息到消息队列。msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg)
:从消息队列接收一条消息。msgctl(int msqid, int cmd, struct msqid_ds *buf)
:控制消息队列的操作,如删除队列。
信号(Signals)
说明
- 信号是一种轻量级的进程间通信机制,用于通知接收进程发生了特定的事件。
- 信号可以由软件或硬件触发。
作用
- 用于进程之间的简单同步和异常处理。
适用场景
- 当需要通知进程处理某种特定事件(如中断、异常终止)时。
- 在需要处理进程异常退出或其他异常情况的情况下。
API
signal(int signum, sighandler_t handler)
:设置信号处理函数。kill(pid_t pid, int sig)
:发送信号给指定进程。raise(int sig)
:发送信号给当前进程。
信号量(Semaphores)
说明
- 信号量用于控制多个进程对共享资源的访问,防止资源的竞争条件。
- 信号量分为二进制信号量和计数信号量。
作用
- 用于进程间的同步,确保资源的安全访问。
适用场景
- 当多个进程需要访问相同的资源时,为了保证数据的一致性,使用信号量进行互斥访问。
- 在需要限制资源使用数量的情况下。
API
semget(key_t key, int nsems, int semflg)
:获取或创建一个信号量集。semop(int semid, struct sembuf *sops, size_t nsops)
:对信号量执行操作(增加/减少)。semctl(int semid, int semnum, int cmd, ...)
:控制信号量的操作,如删除信号量。
共享内存(Shared Memory)
说明
- 共享内存是多个进程可以直接访问的同一段内存区域,是IPC中最高效的机制之一。
- 需要结合其他机制(如信号量)来同步访问以避免竞争条件。
作用
- 用于高效的数据交换,特别适合大量数据的传递。
适用场景
- 当需要在进程间快速传递大量数据时。
- 在需要高性能数据交换的应用场景中。
API
shmget(key_t key, size_t size, int shmflg)
:获取或创建一个共享内存段。shmat(int shmid, const void *shmaddr, int shmflg)
:将共享内存段附加到进程地址空间。shmdt(const void *shmaddr)
:将共享内存段从进程地址空间分离。shmctl(int shmid, int cmd, struct shmid_ds *buf)
:控制共享内存段的操作,如删除。
套接字(Sockets)
说明
- 套接字最初设计用于网络通信,但也可以用于本地进程间的通信。
- 支持多种协议,包括流式套接字(面向连接)和数据报套接字(无连接)。
作用
- 用于进程间的网络通信或本地通信。
适用场景
- 当进程间需要通过网络通信时。
- 当需要构建复杂的服务端/客户端架构时。
API
socket(int domain, int type, int protocol)
:创建一个套接字。bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
:绑定套接字到特定地址。listen(int sockfd, int backlog)
:监听套接字。accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
:接收客户端连接请求。connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
:连接到服务器。send(int sockfd, const void *buf, size_t len, int flags)
:发送数据。recv(int sockfd, void *buf, size_t len, int flags)
:接收数据。shutdown(int sockfd, int how)
:关闭套接字的一个方向。
套接字激活(Socket Activation)
说明
- 套接字激活是由系统服务管理器(如systemd)完成的一种机制,不需要应用程序直接调用特定函数,而是通过配置文件来设置。
作用
- 用于自动分配已监听的套接字给服务进程,简化服务器程序的开发。
适用场景
- 当需要简化服务端程序的启动过程时。
- 在系统初始化过程中自动配置服务端口。
API
- 不需要直接调用API,而是通过配置文件和systemd等服务管理器进行配置。
内存映射文件(Memory-Mapped Files)
说明
- 进程将磁盘上的文件映射到内存中,所有对该内存区域的操作都会写入文件,实现进程间的数据交换。
作用
- 提供了一种简单的方式来进行进程间的数据共享。
适用场景
- 当需要在进程间共享大量数据时,或者需要将文件内容作为内存使用时。
API
mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset)
:映射文件到内存。munmap(void *addr, size_t length)
:取消映射。
进程间共享对象(Inter-Process Shared Objects)
说明
- 包括共享内存区域、文件锁等,提供了一种简单的方式来进行进程间的数据共享。
作用
- 用于进程间的简单数据共享和同步。
适用场景
- 当需要在进程间共享少量数据时。
API
- 通常涉及到共享内存和文件锁等机制的API。
进程间锁(Inter-Process Locks)
说明
- 如flock()和fcntl()函数,用于确保多个进程不会同时修改同一文件。
作用
- 用于进程间的同步,确保数据的一致性。
适用场景
- 当多个进程需要访问同一个文件时,为了保证数据的一致性,使用进程间锁进行互斥访问。
API
flock(int fd, int operation)
:对打开的文件进行锁定。fcntl(int fd, int cmd, ...)
:文件控制命令,可以用来加锁解锁。
以上函数均基于POSIX标准,适用于类Unix系统(如Linux、macOS)。不同系统可能会有所差异,例如Windows平台会使用不同的API来实现这些功能。在选择IPC机制时,应根据实际应用场景的需求和环境来决定最合适的方案。
热门推荐
集体户口管理调整:职业发展更自由,公共服务更均等
心理学专业就业前景:十大方向、薪资水平及地区需求分析
2025鸡年九字春节对联精选:传统文化与美好祝福的完美融合
大规模实验证证:价值观干预提升青少年幸福感
通胀压力下如何守护钱包?四大策略助你应对
思密达敬语用法,连韩国明星都在用!
这场新商大讲堂为新疆民营企业传授经营之道
五谷杂粮喂狗,兽医教你正确姿势
《沉沦:A2P预案》:无需登录的末世生存策略神作
医保购药APP技术架构:三层体系与六大功能模块解析
老君山徒步攻略:十里画屏徒步路线详解与夜景拍摄指南
如何选择适合你的家用冰箱尺寸?超全指南!
自制梅子姜茶:简单3步制作,有效缓解肠胃不适
京郊九公山:长城遗迹守护中的四季美景
“强”字里的力量:竖折折钩的秘密
餐厅级豆角炒肉在家就能做,大厨详解烹饪要点
脂肪肝患者如何摆脱焦虑?
安眠药可能伤肝,这些方法助你保护肝脏
掌握打雪仗技巧,让你成为冬日霸主!
昆明环滇池骑行:120公里湖景路,冬日赏鸥正当时
释放镁的力量:自然对抗头痛的策略
解锁高效提升能力的秘密
高蛋白低脂肉类,让你吃得健康又开心!
150平方米地下城市:切叶蚁的超级工程与社会智慧
斯坦福专家教你科学睡眠,《睡个好觉》成世界睡眠日热门指南
台湾小番茄种植指南:6大品种、8种病害防治全解析
黄山宏村,安徽必打卡景点
哈尔滨锅包肉:郑兴文传人的正宗味道
大尺寸靠真菌,小尺寸靠细菌:最新研究解析有机物分解机制
金牌装维工程师教你搞定机顶盒故障