进程通信:管道与队列

简介: 进程通信:管道与队列

进程间的通信:管道与消息队列

在操作系统中,进程间的通信(Inter-Process Communication, IPC)是一项基础且关键的功能。这种通信方式允许不同的进程交换数据,协调活动,实现各种系统功能。本文将重点讨论两种主要的进程间通信方式:管道(Pipe)和消息队列(Message Queue),并通过代码示例展示它们的具体应用。


一、管道(Pipe

管道是进程间通信的一种基本方式,它允许一个进程将数据写入一个特殊的文件(即管道),然后另一个进程可以从这个文件中读取数据。管道分为匿名管道和命名管道两种。

1.  匿名管道

匿名管道是一种只能在具有亲缘关系的进程间使用的通信方式。在Linux系统中,可以使用pipe()函数创建匿名管道。

下面是一个简单的C语言代码示例,展示了如何使用匿名管道实现父子进程间的通信:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
void read_from_pipe(int fd) {
char message[100];
read(fd, message, sizeof(message));
printf("Read from pipe: %s
", message);
}
void write_to_pipe(int fd) {
char message[] = "Hello from child process!";
write(fd, message, strlen(message) + 1);
}
int main() {
int pipefd[2];
pid_t pid;
if (pipe(pipefd) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
pid = fork();
if (pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (pid > 0) {  // Parent process
close(pipefd[1]);  // Close write end
read_from_pipe(pipefd[0]);
wait(NULL);
} else {  // Child process
close(pipefd[0]);  // Close read end
write_to_pipe(pipefd[1]);
exit(EXIT_SUCCESS);
}
return 0;
}


在上面的代码中,我们首先使用pipe()函数创建了一个匿名管道,然后创建了一个子进程。父进程关闭管道的写端,从读端读取数据;子进程关闭管道的读端,向写端写入数据。这样就实现了父子进程间的通信。

2.  命名管道(FIFO)

命名管道(也称为FIFO)克服了匿名管道只能在具有亲缘关系的进程间通信的限制,允许任意两个进程进行通信。命名管道在文件系统中有一个对应的路径名,因此任何进程都可以通过这个路径名来访问命名管道。


二、消息队列(Message Queue

消息队列是另一种进程间通信的方式,它克服了管道通信效率低的问题。消息队列实际上是在内核中保存的一个消息链表,进程可以向队列中添加消息,也可以从队列中取出消息。消息队列中的每个消息体都可以是用户自定义的数据类型,这提供了很大的灵活性。

Linux系统中,可以使用mq_open(),mq_send(),mq_receive()等函数来操作消息队列。但是,由于消息队列的通信开销较大(每次数据的写入和读取都需要经过用户态与内核态之间的拷贝),因此它通常用于进程间传递少量的数据。

总结来说,管道和消息队列都是进程间通信的重要方式。它们各有优缺点,适用于不同的场景。在实际应用中,我们需要根据具体的需求和场景来选择合适的通信方式。

相关文章
|
11天前
|
消息中间件 分布式计算 网络协议
从管道路由到共享内存:进程间通信的演变(内附通信方式经典面试题及详解)
进程间通信(Inter-Process Communication, IPC)是计算机科学中的一个重要概念,指的是运行在同一系统或不同系统上的多个进程之间互相发送和接收信息的能力。IPC机制允许进程间共享数据、协调执行流程,是实现分布式系统、多任务操作系统和并发编程的基础。
从管道路由到共享内存:进程间通信的演变(内附通信方式经典面试题及详解)
|
2天前
|
Unix Linux Python
`subprocess`模块是Python中用于生成新进程、连接到它们的输入/输出/错误管道,并获取它们的返回(退出)代码的模块。
`subprocess`模块是Python中用于生成新进程、连接到它们的输入/输出/错误管道,并获取它们的返回(退出)代码的模块。
6 0
|
2天前
|
安全 API Python
`multiprocessing`是Python的一个标准库,用于支持生成进程,并通过管道和队列、信号量、锁和条件变量等同步原语进行进程间通信(IPC)。
`multiprocessing`是Python的一个标准库,用于支持生成进程,并通过管道和队列、信号量、锁和条件变量等同步原语进行进程间通信(IPC)。
5 0
|
3天前
|
安全 Linux 数据格式
【Linux】进程通信----管道通信(下)
【Linux】进程通信----管道通信(下)
14 0
|
3天前
|
Unix Linux
【Linux】进程通信----管道通信(上)
【Linux】进程通信----管道通信(上)
20 0
|
17天前
|
监控 Linux 应用服务中间件
探索Linux中的`ps`命令:进程监控与分析的利器
探索Linux中的`ps`命令:进程监控与分析的利器
|
4天前
|
存储 缓存 安全
【Linux】冯诺依曼体系结构与操作系统及其进程
【Linux】冯诺依曼体系结构与操作系统及其进程
39 1
|
10天前
|
小程序 Linux
【编程小实验】利用Linux fork()与文件I/O:父进程与子进程协同实现高效cp命令(前半文件与后半文件并行复制)
这个小程序是在文件IO的基础上去结合父子进程的一个使用,利用父子进程相互独立的特点实现对数据不同的操作
|
10天前
|
SQL 自然语言处理 网络协议
【Linux开发实战指南】基于TCP、进程数据结构与SQL数据库:构建在线云词典系统(含注册、登录、查询、历史记录管理功能及源码分享)
TCP(Transmission Control Protocol)连接是互联网上最常用的一种面向连接、可靠的、基于字节流的传输层通信协议。建立TCP连接需要经过著名的“三次握手”过程: 1. SYN(同步序列编号):客户端发送一个SYN包给服务器,并进入SYN_SEND状态,等待服务器确认。 2. SYN-ACK:服务器收到SYN包后,回应一个SYN-ACK(SYN+ACKnowledgment)包,告诉客户端其接收到了请求,并同意建立连接,此时服务器进入SYN_RECV状态。 3. ACK(确认字符):客户端收到服务器的SYN-ACK包后,发送一个ACK包给服务器,确认收到了服务器的确
|
17天前
|
Web App开发 运维 监控
深入探索Linux命令pwdx:揭秘进程工作目录的秘密
`pwdx`命令在Linux中用于显示指定进程的工作目录,基于`/proc`文件系统获取实时信息。简单易用,如`pwdx 1234`显示PID为1234的进程目录。结合`ps`和`pgrep`等命令可扩展使用,如查看所有进程或特定进程(如Firefox)的目录。使用时注意权限、进程ID的有效性和与其他命令的配合。查阅`man pwdx`获取更多帮助。