Linux管道pipe详解
什么是管道
管道是一种最基本的IPC机制,用于实现进程间的通信。它的本质是一个伪文件,实际上是内核中的一个缓冲区。通过两个文件描述符引用,一个用于读取数据,一个用于写入数据。数据从管道的写端流入管道,从读端流出。
创建管道
在Linux中,可以使用pipe函数创建管道。该函数的原型为:
int pipe(int pipefd[2]);
成功创建管道时,函数返回0,失败时返回-1,并设置errno。函数调用成功后,会返回两个文件描述符,一个用于读取数据,一个用于写入数据。需要注意的是,不需要使用open函数打开管道文件,但在使用完后需要手动调用close函数关闭文件描述符。
父子进程间通信
在父子进程间进行通信时,通常可以按照以下步骤进行:
- 父进程调用pipe函数创建管道,得到两个文件描述符fd[0]和fd[1]。
- 父进程使用fork函数创建子进程。
- 父进程关闭fd[0](读端),子进程关闭fd[1](写端)。
- 父进程通过fd[1]向管道写入数据,子进程通过fd[0]从管道读取数据。
示例代码
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h>
void sys_err(const char *str) {
perror(str);
exit(1);
}
int main(void) {
pid_t pid;
char buf[1024];
int fd[2];
char *p = "test for pipe\n";
if (pipe(fd) == -1)
sys_err("pipe");
pid = fork();
if (pid == -1)
sys_err("fork");
if (pid == 0) { // 子进程
close(fd[1]); // 关闭写端
read(fd[0], buf, sizeof(buf)); // 从管道读取数据
printf("Child process read data: %s", buf);
close(fd[0]);
} else { // 父进程
close(fd[0]); // 关闭读端
write(fd[1], p, strlen(p)); // 向管道写入数据
close(fd[1]);
wait(NULL); // 等待子进程结束
}
return 0;
}
以上是关于Linux管道的基本介绍和示例代码。通过使用管道,可以方便地实现进程间的通信,实现数据的传输和共享。