Unix 如何使用管道在围棋中编写“cat”
我在下面有一个Unix工具Unix 如何使用管道在围棋中编写“cat”,unix,go,Unix,Go,我在下面有一个Unix工具cat的实现。它从os.Stdin读取大量字节到缓冲区,然后将这些字节写到os.Stdout。有没有办法跳过缓冲区,直接将Stdin管道传输到Stdout package main import "os" import "io" func main() { buf := make([]byte, 1024) var n int var err error for err != io.EOF { n, err = os
cat
的实现。它从os.Stdin
读取大量字节到缓冲区,然后将这些字节写到os.Stdout
。有没有办法跳过缓冲区,直接将Stdin
管道传输到Stdout
package main
import "os"
import "io"
func main() {
buf := make([]byte, 1024)
var n int
var err error
for err != io.EOF {
n, err = os.Stdin.Read(buf)
if n > 0 {
os.Stdout.Write(buf[0:n])
}
}
}
您可以使用io.Copy()
例如:
package main
import (
"os"
"io"
"log"
)
func main() {
if _, err := io.Copy(os.Stdout, os.Stdin); err != nil {
log.Fatal(err)
}
}
比如说,
package main
import (
"io"
"os"
)
func main() {
io.Copy(os.Stdout, os.Stdin)
}
我不知道Go,但是cat也可以从命令行和stdin读取文件……所以如果你正在实现,你也需要包括这个功能。@WoodrowDouglass谢谢,但我实际上并不是在为
cat
创建一个替代品,只是把stdin/Stdout作为练习。当然,io.Copy使用循环和缓冲区,与原始代码非常相似。@nos我想可以使用syscall.Sendfile()
,但我认为这不是OP的重点。@nos@Staven实际上我更愿意避免复制到缓冲区中。如何使用Sendfile()
?@SamSendfile()
几乎就是一个瘦包装器后面的LinuxSendfile()
系统调用;有关文档,请参阅man sendfile
。除非您已经确认Copy()
是一个瓶颈,否则您不应该为此烦恼。