当前位置:首页 > 系统教程 > 正文

Linux进程间通信(一):认识管道从零开始掌握进程间通信

Linux进程间通信(一):认识管道从零开始掌握进程间通信

在Linux系统中,进程间通信(IPC,Inter-Process Communication)是一个核心概念。当多个进程需要协同工作时,它们必须交换数据或同步状态。Linux进程间通信提供了多种机制,如管道、消息队列、共享内存等。而管道作为最简单、最古老的一种,是每个开发者入门IPC的必经之路。

什么是管道?

管道(Pipe)是一种半双工的通信方式,数据只能单向流动。它通常用于具有亲缘关系的进程之间(如父子进程或兄弟进程)。在Shell中,我们经常使用管道符|来连接命令,例如:ls | grep txt,这其实就是匿名管道的应用——将ls的输出作为grep的输入。

Linux进程间通信(一):认识管道从零开始掌握进程间通信 Linux进程间通信  管道 匿名管道 pipe函数 第1张

匿名管道:pipe()函数

在C语言中,我们可以通过pipe函数创建匿名管道。函数原型如下:

#include int pipe(int pipefd[2]);

调用成功时,pipefd返回两个文件描述符:pipefd[0]为读端,pipefd[1]为写端。数据从写端流入,从读端流出。下面是一个完整的示例,演示父子进程通过匿名管道通信:

#include #include #include #include int main() {    int pipefd[2];    pid_t pid;    char buffer[128];    if (pipe(pipefd) == -1) {        perror("pipe");        exit(EXIT_FAILURE);    }    pid = fork();    if (pid == -1) {        perror("fork");        exit(EXIT_FAILURE);    }    if (pid == 0) {  // 子进程        close(pipefd[1]);  // 关闭写端        read(pipefd[0], buffer, sizeof(buffer));        printf("子进程收到:%s", buffer);        close(pipefd[0]);    } else {  // 父进程        close(pipefd[0]);  // 关闭读端        char *msg = "Hello from parent!";        write(pipefd[1], msg, strlen(msg) + 1);        close(pipefd[1]);    }    return 0;}

这段代码中,父进程向管道写入字符串,子进程读取并打印。注意,使用pipe函数时,务必关闭不需要的端口,以避免资源泄漏和意外行为。

管道的读写行为

当所有写端被关闭后,读端读取时会返回0(类似文件结尾)。如果读端关闭,写端继续写入,内核会发送SIGPIPE信号终止进程。此外,管道默认是阻塞的:如果读端没有数据,read会阻塞;如果管道满,write也会阻塞。这些特性让管道变得简单而可靠。

拓展:命名管道(FIFO)

匿名管道只能在有共同祖先的进程间使用,而命名管道(FIFO)允许无亲缘关系的进程通信。它通过文件系统的一个特殊文件来实现,使用mkfifo()创建。我们将在下一篇文章中详细介绍。


本文关键词:Linux进程间通信管道匿名管道pipe函数,希望对你理解IPC有所帮助。