go语言接收linux/unix管道的数据

管道的内容,位于os.Stdin里,可以像普通文件一个操作os.Stdin,即可获取管道传过来的内容。

package main

import (
    "bufio"
    "fmt"
    "log"
    "os"
)

func main() {
    fileInfo, _ := os.Stdin.Stat()
    if (fileInfo.Mode() & os.ModeNamedPipe) != os.ModeNamedPipe {
        log.Fatal("The command is intended to work with pipes.")
    }
    s := bufio.NewScanner(os.Stdin)
    for s.Scan() {
        fmt.Println(s.Text())
    }
}

通过os.Stdin的mode值来判断程序是否通过管道调用。

调用方法:cat test.txt |./pipe

参考url:http://blog.ralch.com/tutorial/golang-command-line-pipes/

时间: 2024-12-19 20:45:16

go语言接收linux/unix管道的数据的相关文章

linux程序设计——管道输出数据到popen(第十三章)

13.3    将输出送往popen 看过捕获外部程序输出的例子后,再来看一个将输出发送到外部程序的示例程序popen2.c,它将数据通过管道送到另一个程序.在这里使用的是od(八进制)命令. 编写程序popen2.c,它非常类似popen1.c,唯一的不同是这个程序将数据写入管道,而不是从管道中读取. /************************************************************************* > File Name: popen2.c

【python】使用unix管道pipe处理stdout实时数据

现在有个实时抓包处理的程序,大概的流程是 使用tshark抓包->实时上传,如果写log的话是可以的,但是log文件切割需要定时执行. 由于log中有些内容需要实时处理,延迟时间会导致数据误差,所以想到用类似unix管道的方式,实时处理掉标准输出的内容处理,类似生产消费者模式. 场景解说 简单的流程就是 程序输出内容到stdout--> python pipe--> python 处理程序读取管道内的输出内容,然后后续处理 正常情况下可以用生产者消费者模式或者队列来搞定,但是呢这里最开始

Linux内核中网络数据包的接收-第一部分 概念和框架

与网络数据包的发送不同,网络收包是异步的的,因为你不确定谁会在什么时候突然发一个网络包给你,因此这个网络收包逻辑其实包含两件事:1.数据包到来后的通知2.收到通知并从数据包中获取数据这两件事发生在协议栈的两端,即网卡/协议栈边界以及协议栈/应用边界:网卡/协议栈边界:网卡通知数据包到来,中断协议栈收包:协议栈栈/应用边界:协议栈将数据包填充socket队列,通知应用程序有数据可读,应用程序负责接收数据.本文就来介绍一下关于这两个边界的这两件事是怎么一个细节,关乎网卡中断,NAPI,网卡poll,

关于Linux/Unix数据自动备份工具

我们在编写程序的时候经常会需要对数据进行备份,那么就需要使用到自动备份工具,那么你对Linux/Unix数据自动备份工具了解有多少呢? 下面我们就一起去看看关于Linux/Unix数据自动备份工具的内容. primabackup.sh 说明文档 版本:2.0.1 0. 版本更新 * 2006-11-23 SWsoft.com.cn v2.0.2 - [fix] 修复resin路径 * 2005-03-28 ValueOf.com v2.0.1 - [fix] 备份resin和tomcat的配置

Linux进程间通信—管道

Linux下的进程通信手段基本上是从UNIX平台上的进程通信手段继承而来的.而对UNIX发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间的通信方面的侧重点有所不同.前者是对UNIX早期的进程间通信手段进行了系统的改进和扩充,形成了"system V IPC",其通信进程主要局限在单个计算机内:后者则跳过了该限制,形成了基于套接口(socket)的进程间通信机制.而Linux则把两者的优势都继承了下来 linux进程间通信(

Linux/UNIX进程间的通信(1)

进程间的通信(1) 进程间的通信IPC(InterProcessCommunication )主要有以下不同形式: 半双工管道和FIFO:全双工管道和命名全双工管道:消息队列,信号量和共享存储:套接字和STREAMS 管道 pipe函数 当从一个进程连接到另一个进程时,我们使用术语管道.我们通常是把一个进程的输出通过管道连接到另一个进程的输入. 管道是由调用pipe函数创建的: #include<unistd.h> int pipe(intpipefd[2]); 经由参数pipefd返回两个文

linux命令管道工作原理与使用方法

一.管道定义 管道是一种两个进程间进行单向通信的机制.因为管道传递数据的单向性,管道又称为半双工管道.管道的这一特点决定了器使用的局限性.管道是Linux支持的最初Unix IPC形式之一,具有以下特点: *** 数据只能由一个进程流向另一个进程(其中一个读管道,一个写管道):如果要进行双工通信,需要建 立两个管道. *** 管道只能用于父子进程或者兄弟进程间通信.,也就是说管道只能用于具有亲缘关系的进程间通信. 注意:从管道读数据是一次性操作,数据一旦被读,它就从管道中被抛弃,释放空间以便写更

Linux/UNIX之进程间的通信(2)

进程间的通信(2) 有三种IPC我们称为XSI IPC,即消息队列.信号量以及共享存储器,它们之间有很多相似之处. 标识符和键 每个内核的IPC结构(消息队列.信号量或共享存储段)都用一个非负整数的标识符加以引用.例如,为了对一个消息队列发送或取消息,只需要知道其队列标识符.与文件描述符不同,IPC标识符不是小的整数.当一个IPC结构被创建,以后被删除时,与这种结果相关的标识符连续加1,知道达到一个整型数的最大值,然后又回到0. 标识符是IPC对象的内部名.为使多个合作进程能够在同一IPC对象上

Linux/UNIX线程控制

线程控制 线程属性 调用pthread_create函数的例子中,传入的参数都是空指针,而不是指向pthread_attr_t结果的指针.可以用pthread_attr_t结构修改线程默认属性,并把这些属性与创建的线程联系起来.可以使用pthread_attr_init函数初始化pthreaad_attr_t结构.调用pthread_attr_init以后,pthread_attr_t结构所包含的内容就是操作系统实现支持的线程所有属性的默认值.如果要修改其中个别属性的值,需要调用其他的函数.pt