LINUXPIPE

Linux管道pipe详解

什么是管道

管道是一种最基本的IPC机制,用于实现进程间的通信。它的本质是一个伪文件,实际上是内核中的一个缓冲区。通过两个文件描述符引用,一个用于读取数据,一个用于写入数据。数据从管道的写端流入管道,从读端流出。

创建管道

在Linux中,可以使用pipe函数创建管道。该函数的原型为:

int pipe(int pipefd[2]);

成功创建管道时,函数返回0,失败时返回-1,并设置errno。函数调用成功后,会返回两个文件描述符,一个用于读取数据,一个用于写入数据。需要注意的是,不需要使用open函数打开管道文件,但在使用完后需要手动调用close函数关闭文件描述符。

父子进程间通信

在父子进程间进行通信时,通常可以按照以下步骤进行:

  1. 父进程调用pipe函数创建管道,得到两个文件描述符fd[0]和fd[1]。
  2. 父进程使用fork函数创建子进程。
  3. 父进程关闭fd[0](读端),子进程关闭fd[1](写端)。
  4. 父进程通过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管道的基本介绍和示例代码。通过使用管道,可以方便地实现进程间的通信,实现数据的传输和共享。

LINUXPIPE