📜  制作命名管道 (1)

📅  最后修改于: 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 函数。