【Linux】进程通信 — 管道
发布人:shili8
发布时间:2025-02-21 17:04
阅读次数:0
**Linux 进程通信 — 管道**
在 Linux 中,进程之间可以通过管道(pipe)进行通信。管道是一种特殊的文件描述符,它允许两个或多个进程之间传递数据。
###什么是管道?
管道是一种单向的通信机制,允许一个进程将数据写入管道,而另一个进程可以从管道中读取数据。管道不需要共享内存或其他同步机制。
### 管道类型Linux 提供两种类型的管道:
1. **匿名管道**(Anonymous Pipe):匿名管道是最简单的一种管道,它没有名字,仅在创建它的进程之间有效。
2. **命名管道**(Named Pipe):命名管道是通过 `mkfifo` 命令创建的,它有一个固定的名称,可以被多个进程访问。
### 匿名管道匿名管道是通过 `pipe()` 系统调用创建的。它是一个单向的通信机制,允许一个进程将数据写入管道,而另一个进程可以从管道中读取数据。
c#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { int pipefd[2]; // 创建匿名管道 if (pipe(pipefd) == -1) { perror("pipe"); exit(EXIT_FAILURE); } pid_t pid = fork(); if (pid ==0) { // 子进程 close(pipefd[0]); // 关闭读端 char buffer[10]; write(pipefd[1], "Hello, world!",13); // 写入管道 printf("子进程写入管道成功 "); close(pipefd[1]); // 关闭写端 } else { // 父进程 close(pipefd[1]); // 关闭写端 char buffer[10]; read(pipefd[0], buffer,13); // 从管道中读取数据 printf("父进程从管道中读取数据:%s ", buffer); close(pipefd[0]); // 关闭读端 } return0; }
### 命名管道命名管道是通过 `mkfifo` 命令创建的,它有一个固定的名称,可以被多个进程访问。
c#include <stdio.h> #include <stdlib.h> int main() { // 创建命名管道 if (system("mkfifo mypipe") == -1) { perror("mkfifo"); exit(EXIT_FAILURE); } pid_t pid = fork(); if (pid ==0) { // 子进程 char buffer[10]; write(mypipe, "Hello, world!",13); // 写入管道 printf("子进程写入管道成功 "); } else { // 父进程 char buffer[10]; read(mypipe, buffer,13); // 从管道中读取数据 printf("父进程从管道中读取数据:%s ", buffer); } return0; }
### 总结Linux 提供两种类型的管道:匿名管道和命名管道。匿名管道是通过 `pipe()` 系统调用创建的,它是一个单向的通信机制,允许一个进程将数据写入管道,而另一个进程可以从管道中读取数据。命名管道是通过 `mkfifo` 命令创建的,它有一个固定的名称,可以被多个进程访问。
### 参考* [Linux Pipe]( />* [Named Pipes in Linux](