您的位置 首页 golang

golang – 接收unix/linux管道数据

在使用go语言写cli程序的时候,为了方便操作,很多时候需要使用管道的功能来传递数据。

通过os.Stdin的mode值来判断程序是否通过管道调用,需要跟FileMode进行 位运算 来判断标准输入是否是管道。

type FileMode uint32
 

FileMode代表文件的模式和权限位。这些字位在所有的操作系统都有相同的含义,因此文件的信息可以在不同的操作系统之间安全的移植。不是所有的位都能用于所有的系统,唯一共有的是用于表示目录的ModeDir位。

 const  (
 // 单字符是被String方法用于格式化的属性缩写。
 ModeDir FileMode = 1 << (32 - 1 - iota) // d: 目录
 ModeAppend // a: 只能写入,且只能写入到末尾
 ModeExclusive // l: 用于执行
 ModeTemporary // T: 临时文件(非备份文件)
 ModeSymlink // L: 符号链接(不是快捷方式文件)
 ModeDevice // D: 设备
 ModeNamedPipe // p: 命名管道(FIFO)
 Mode socket  // S:  unix 域socket
 ModeSetuid // u: 表示文件具有其创建者用户id权限
 ModeSetgid // g: 表示文件具有其创建者组id的权限
 ModeCharDevice // c: 字符设备,需已设置ModeDevice
 ModeSticky // t: 只有 root /创建者能删除/移动文件
 // 覆盖所有类型位(用于通过&获取类型位),对普通文件,所有这些位都不应被设置
 ModeType = ModeDir | ModeSymlink | ModeNamedPipe | ModeSocket | ModeDevice
 ModePerm FileMode = 0777 // 覆盖所有Unix权限位(用于通过&获取类型位)
)
 

这些被定义的位是FileMode最重要的位。另外9个不重要的位为标准Unix rwxrwxrwx权限(任何人都可读、写、运行)。这些(重要)位的值应被视为公共API的一部分,可能会用于线路协议或硬盘标识:它们不能被修改,但可以添加新的位。

代码

package main
import (
"bufio"
"fmt"
"os"
)
func main() {
fileInfo, _ := os.Stdin.Stat()
if (fileInfo.Mode() & os.ModeNamedPipe) != os.ModeNamedPipe {
fmt.Println("没有通过管道传输数据")
return
}
s := bufio.NewScanner(os.Stdin)
for s.Scan() {
fmt.Println("管道内容:", s.Text())
}
}
 

文章来源:智云一二三科技

文章标题:golang – 接收unix/linux管道数据

文章地址:https://www.zhihuclub.com/98837.shtml

关于作者: 智云科技

热门文章

网站地图