📅  最后修改于: 2023-12-03 15:36:57.510000             🧑  作者: Mango
命名管道(named pipe)是一种命名的 FIFO (先进先出)机制,用于进程间通信。在 Linux 中,可以通过 mkfifo 函数创建命名管道。
使用 mkfifo 函数创建命名管道,需要指定一个文件名作为管道的名字。例如:
mkfifo("my_pipe", 0666);
上述代码将创建一个名为 “my_pipe” 的命名管道,权限为 0666,可以被所有用户读写。
命名管道本质上是一个特殊的文件。进程可以像操作普通文件一样写入和读取数据。例如,向命名管道写入数据:
int fd = open("my_pipe", O_WRONLY); // 打开管道
write(fd, "hello, named pipe", 18); // 写入数据
close(fd); // 关闭管道
读取命名管道中的数据:
int fd = open("my_pipe", O_RDONLY); // 打开管道
char buffer[1024];
ssize_t n = read(fd, buffer, 1024); // 读取数据
close(fd); // 关闭管道
下面是一个简单的示例程序,创建一个子进程向管道写入数据,主进程从管道读取数据:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main() {
int fd;
// 创建命名管道
mkfifo("my_pipe", 0666);
// 创建子进程
if (fork() == 0) {
// 子进程向管道写入数据
fd = open("my_pipe", O_WRONLY);
write(fd, "hello, named pipe", 18);
close(fd);
exit(0);
} else {
// 父进程从管道读取数据
fd = open("my_pipe", O_RDONLY);
char buffer[1024];
ssize_t n = read(fd, buffer, 1024);
printf("received: %.*s\n", n, buffer);
close(fd);
}
return 0;
}
运行上述程序,输出:
received: hello, named pipe
命名管道是一种进程间通信的机制,可以用于同一台计算机上的进程间通信。创建命名管道需要使用 mkfifo 函数,写入和读取数据可以使用普通文件 I/O 函数。