在Linux系统编程中,进程间通信(IPC)是一个核心概念。本文将详细介绍一种重要的IPC机制——命名管道(Named Pipe),也称为FIFO。通过本文,即使是初学者也能掌握命名管道的原理、创建方法以及如何在实际项目中应用。
进程间通信(IPC)是操作系统中不同进程之间交换数据或信号的机制。Linux提供了多种IPC方式,如管道、消息队列、共享内存、信号量等。其中,命名管道(FIFO)是一种特殊的文件类型,它允许无亲缘关系的进程之间进行通信,弥补了匿名管道只能用于父子进程的不足。
匿名管道(pipe)是Linux中最古老的IPC形式,它通过pipe()系统调用创建,返回两个文件描述符,分别用于读和写。但匿名管道只能在有共同祖先(如父子)的进程之间使用,且通信结束后自动消失。命名管道(FIFO)则不同,它在文件系统中有一个名字(路径名),任何进程只要知道这个名字就可以通过它通信,即使没有亲缘关系。此外,命名管道以文件形式存在,可以像普通文件一样设置权限,生命周期由用户管理。
在命令行中,可以使用mkfifo命令创建一个命名管道:
$ mkfifo myfifo
在C语言中,使用mkfifo()函数,原型如下:
#include#include int mkfifo(const char *pathname, mode_t mode);
参数pathname是管道路径,mode指定权限(如0666)。成功返回0,失败返回-1。
命名管道是一个阻塞型文件:当一个进程以只读方式打开FIFO时,它会阻塞直到另一个进程以只写方式打开同一个FIFO;反之亦然。这种特性天然实现了进程同步。写入的数据被内核缓存,直到被读取。读写操作遵循先进先出(FIFO)原则,故名。
需要注意的是,如果没有进程以写方式打开,读操作会阻塞;如果写端没有数据,读操作也会阻塞(类似于管道)。如果所有写端关闭,读端将读到EOF(返回0)。
我们编写两个C程序:writer.c向管道写入数据,reader.c从管道读取数据。
#include#include #include #include #include #include int main() { int fd; char *fifo = "/tmp/myfifo"; mkfifo(fifo, 0666); char msg[] = "Hello from writer!"; fd = open(fifo, O_WRONLY); write(fd, msg, strlen(msg)+1); close(fd); return 0;}
#include#include #include #include #include int main() { int fd; char *fifo = "/tmp/myfifo"; char buf[100]; fd = open(fifo, O_RDONLY); read(fd, buf, sizeof(buf)); printf("Received: %s", buf); close(fd); return 0;}
运行说明:先在一个终端启动reader,它会阻塞等待写端打开;然后在另一个终端启动writer,此时reader会收到消息并打印。注意:需要先创建FIFO,代码中已包含mkfifo,但实际使用时建议检查返回值。
open时设置O_NONBLOCK标志改为非阻塞模式。PIPE_BUF(通常为4096字节)时,写入是原子的,不会与其他写操作交错。unlink或remove。本文详细介绍了Linux进程间通信中的命名管道(FIFO)。通过实例,我们看到了FIFO通信的简单性和实用性。在实际开发中,命名管道常用于本地进程间的数据交换,但需要注意进程同步和阻塞问题。希望本文能帮助你深入理解命名管道,并将其应用到自己的项目中。
本文由主机测评网于2026-03-15发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:http://www.vpshk.cn/20260331358.html