进程间通信(IPC, Inter-Process Communication)
是指在操作系统中,不同进程之间进行数据交换和信息共享的技术。管道(Pipe)是其中一种简单且常用的IPC机制,特别适用于具有亲缘关系的进程(通常是父进程和子进程之间)之间的数据传输。管道分为两种类型:无名管道(匿名管道)和命名管道(FIFO,First In First Out)。
管道简单来说就是:是一系列将标准输入输出链接起来的进程,其中每一个进程的输出被直接作为下一个进程的输入。下面通过例子介绍下匿名管道。
1.示意图
无名管道是一种半双工通信方式,即数据只能单向流动,而且只能在具有共同祖先的进程间使用。当一个进程创建管道并fork出子进程后,父子进程就可以通过这个管道进行通信。
2.特点
-
管道传输数据是单向的
-
如果想相互通信,我们需要创建两个管道才行
3.示例:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main() {
int fd[2]; // 文件描述符数组,fd[0]用于读,fd[1]用于写
char write_msg[] = "Hello from parent process!\n";
char read_msg[80];
// 创建管道
if (pipe(fd) == -1) {
perror("Pipe creation failed");
return 1;
}
// 创建子进程
pid_t pid = fork();
if (pid < 0) { // fork失败
perror("Fork failed");
return 1;
} else if (pid > 0) { // 父进程
// 关闭不需要的管道读端
close(fd[0]);
// 通过管道写端写入消息
write(fd[1], write_msg, strlen(write_msg) + 1);
// 关闭管道写端
close(fd[1]);
printf("Parent process wrote message.\n");
} else { // 子进程
// 关闭不需要的管道写端
close(fd[1]);
// 从管道读端读取消息
read(fd[0], read_msg, sizeof(read_msg));
printf("Child process received: %s", read_msg);
// 关闭管道读端
close(fd[0]);
}
return 0;
}