在Linux系统中,进程间通信(IPC)是编程的核心技术之一。本文将聚焦于命名管道(FIFO),一种简单而强大的IPC方式。无论你是初学者还是老手,这篇万字长文都将带你彻底搞懂命名管道。
命名管道(也称为FIFO)是一种特殊类型的文件,它在文件系统中存在一个路径名。与匿名管道不同,命名管道允许无关的进程通过这个名字进行通信。它是半双工的,数据只能单向流动。在Linux中,使用mkfifo命令或mkfifo()函数创建。
你可以通过命令行创建命名管道:mkfifo myfifo。或者在C程序中:
#include #include int mkfifo(const char *pathname, mode_t mode); 例如,mkfifo("myfifo", 0666);创建一个权限为666的命名管道。
命名管道在读写时默认是阻塞的。如果没有进程打开管道写端,读进程会阻塞直到有写端打开。反之亦然。这种机制使得进程间通信同步变得简单。此外,写入的数据是原子性的,只要写入大小不超过PIPE_BUF(通常为4096字节),就不会与其他写入交错。
下面是一个完整的示例,包括写进程和读进程。写进程向命名管道发送消息,读进程接收并打印。
#include #include #include #include int main() { int fd = open("myfifo", O_WRONLY); char msg[] = "Hello from writer!"; write(fd, msg, sizeof(msg)); close(fd); return 0;} #include #include #include int main() { int fd = open("myfifo", O_RDONLY); char buffer[128]; read(fd, buffer, sizeof(buffer)); printf("Received: %s", buffer); close(fd); return 0;} 编译运行,先运行读进程(会阻塞),再运行写进程,即可看到通信成功。
由于管道是单向的,要实现双向通信,可以创建两个命名管道。例如,fifo1和fifo2,一个用于A->B,一个用于B->A。这就是所谓的FIFO双向通信模型。
命名管道是Linux进程间通信的重要工具,通过本文的详细讲解,相信你已经掌握了FIFO的创建、读写以及实战技巧。继续深入学习,你还可以探索共享内存、消息队列等更高级的IPC方式。但命名管道以其简单性,在适当场景下依然是最佳选择。
本文关键词:命名管道、FIFO、进程间通信、Linux编程
本文由主机测评网于2026-02-18发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20260225673.html