0

0

Go 语言中使用 Unix FIFO (命名管道)

碧海醫心

碧海醫心

发布时间:2025-08-03 15:42:01

|

904人浏览过

|

来源于php中文网

原创

go 语言中使用 unix fifo (命名管道)

本文介绍了如何在 Go 语言中创建 Unix FIFO (命名管道)。由于 Go 的 os 包中没有直接提供 Mkfifo 或 Mknod 函数,我们需要借助 syscall 包来实现创建命名管道的功能。本文将提供详细的代码示例和注意事项,帮助开发者在 Go 项目中灵活运用命名管道。

创建 Unix FIFO (命名管道)

在 Go 语言中,虽然 os 包提供了创建匿名管道(pipe)的功能,但没有直接提供创建命名管道(FIFO)的函数。我们需要使用 syscall 包来调用底层的 mknod() 系统调用。

以下是一个创建命名管道的示例代码:

package main

import (
    "fmt"
    "syscall"
    "os"
)

func main() {
    fifoPath := "/tmp/my_fifo" // 替换为你希望创建的 FIFO 路径

    // 检查FIFO是否存在,如果存在则删除
    if _, err := os.Stat(fifoPath); err == nil {
        err := os.Remove(fifoPath)
        if err != nil {
            fmt.Println("Error removing existing FIFO:", err)
            return
        }
    }

    // 使用 syscall.Mknod 创建 FIFO
    err := syscall.Mknod(fifoPath, syscall.S_IFIFO|0666, 0)
    if err != nil {
        fmt.Println("Error creating FIFO:", err)
        return
    }

    fmt.Printf("FIFO created successfully at: %s\n", fifoPath)

    // 示例:向 FIFO 写入数据
    go func() {
        file, err := os.OpenFile(fifoPath, os.O_WRONLY, os.ModeNamedPipe)
        if err != nil {
            fmt.Println("Error opening FIFO for writing:", err)
            return
        }
        defer file.Close()

        message := "Hello from Go!"
        _, err = file.WriteString(message)
        if err != nil {
            fmt.Println("Error writing to FIFO:", err)
            return
        }
        fmt.Println("Message written to FIFO.")
    }()

    // 示例:从 FIFO 读取数据
    go func() {
        file, err := os.OpenFile(fifoPath, os.O_RDONLY, os.ModeNamedPipe)
        if err != nil {
            fmt.Println("Error opening FIFO for reading:", err)
            return
        }
        defer file.Close()

        buffer := make([]byte, 1024)
        n, err := file.Read(buffer)
        if err != nil {
            fmt.Println("Error reading from FIFO:", err)
            return
        }

        fmt.Printf("Message read from FIFO: %s\n", buffer[:n])
    }()

    // 保持程序运行一段时间,以便读写操作完成
    fmt.Println("Waiting for messages...")
    select {} // 阻塞主goroutine

}

代码解释:

  1. 引入必要的包: fmt, syscall, os 用于格式化输出、系统调用和文件操作。
  2. 定义 FIFO 路径: fifoPath 变量存储了 FIFO 文件的路径。 请根据你的需求修改此路径。
  3. 检查并删除已存在的 FIFO: 在创建FIFO之前,代码会检查该路径下是否存在FIFO文件。如果存在,则先删除,避免创建失败。
  4. 调用 syscall.Mknod: 使用 syscall.Mknod 函数创建 FIFO。
    • 第一个参数是 FIFO 的路径。
    • 第二个参数是文件模式,syscall.S_IFIFO 表示创建一个 FIFO,0666 是权限设置 (读写权限)。
    • 第三个参数通常为 0。
  5. 错误处理: 代码检查 syscall.Mknod 的返回值,如果发生错误,则输出错误信息并退出。
  6. 示例读写操作: 代码使用两个 goroutine 分别演示了向 FIFO 写入数据和从 FIFO 读取数据。 注意,读写 FIFO 的操作会阻塞,直到有数据可读或可写。
  7. 阻塞主 Goroutine: 使用 select {} 阻塞主 Goroutine,防止程序过早退出,以便让读写操作完成。

编译和运行:

百度GBI
百度GBI

百度GBI-你的大模型商业分析助手

下载

将代码保存为 fifo_example.go,然后在终端中执行以下命令:

go run fifo_example.go

注意事项:

  • 权限: 确保你有足够的权限在指定的路径创建 FIFO。
  • 阻塞: 读写 FIFO 的操作是阻塞的。如果 FIFO 中没有数据可读,Read 操作会一直阻塞,直到有数据写入。同样,如果 FIFO 已满,Write 操作也会阻塞,直到有空间可用。
  • 错误处理: 务必进行充分的错误处理,以确保程序的健壮性。
  • 删除 FIFO: 在程序退出后,建议删除创建的 FIFO,以避免占用系统资源。可以使用 os.Remove(fifoPath) 删除。
  • 并发安全: 在多个 goroutine 中读写同一个 FIFO 时,需要考虑并发安全问题。可以使用互斥锁等机制来保护共享资源。

总结:

通过使用 syscall.Mknod 函数,我们可以在 Go 语言中轻松创建 Unix FIFO (命名管道)。 在实际应用中,可以利用 FIFO 实现进程间通信,例如,一个进程负责生成数据,另一个进程负责消费数据。 使用时,务必注意权限、阻塞和并发安全等问题,以确保程序的正确性和稳定性。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
unix和linux的区别
unix和linux的区别

unix和linux的区别包括发展历史、开源性、发行版本、内核、文件系统、应用程序兼容性和用户界面等。本专题为大家提供unix和linux相关的文章、下载、课程内容,供大家免费下载体验。

386

2023.09.22

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

69

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

72

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

67

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号