首页 > 解决方案 > 是否可以通过关闭 src 来中断 io.Copy?

问题描述

代码示例:

package main

import (
    "io"
    "os"
    "os/signal"
    "sync"
    "syscall"
)

func main() {
    sigintCh := make(chan os.Signal, 1)
    signal.Notify(sigintCh, syscall.SIGINT, syscall.SIGTERM)

    var wg sync.WaitGroup
    wg.Add(1)
    go func() {
        defer wg.Done()
        io.Copy(os.Stdout, os.Stdin)
    }()

    <-sigintCh

    os.Stdin.Close()

    wg.Wait()
}

如果运行此示例并尝试中断^C它会等待任何输入并仅在向标准输入发送某些内容后停止(例如,只需按 enter)。

我希望关闭 Stdin 就像发送 EOF 一样,但它不起作用。

标签: goio

解决方案


关闭os.Stdin将导致下次读取时io.Copy返回错误(在 之后,尝试按)。file already closedCTRL-CEnter

File.Close文档中所述:

Close 关闭文件,使其无法用于 I/O。

您不能通过os.Stdin关闭它(或任何其他方式)来强制返回 EOF。相反,您需要包装os.Stdin并实现自己的Read有条件返回的方法EOF,或者在循环中读取有限数量的字节。

您可以在这个golang-nuts线程上看到更多讨论和可能的解决方法。


推荐阅读