如何在阅读中阻止golang os.File?

时间:2017-12-05 02:41:41

标签: go goroutine

我启动两个goroutine来转发两个io.ReadWriter之间的消息,其中rw1是类型为Conn.net的TCP连接,而rw2*os.File的类型使用pty library构建telnet连接。这是转发代码:

func Connection(northConn net.Conn) {
    // code omit ...        

    transport(northConn, sourthConn)

    // code omit ...

    sourthConn.Close() // close
}

func transport(rw1, rw2 io.ReadWriter) error {
    errc := make(chan error, 1)
    go func() {
        _, err := io.Copy(rw1, rw2)
        errc <- err
    }()

    go func() {
        _, err := io.Copy(rw2, rw1)
        errc <- err
    }()

    err := <-errc
    if err != nil && err == io.EOF {
        err = nil
    }
    return err
}

管道是“A&lt; - &gt; rw1(northConn)&lt; - &gt; rw2(sourthConn)&lt; - &gt; telnet server”其中A通过TCP与rw1通信连接,rw2通过*os.File读写来与telnet服务器通信。以上两个goroutine只是在rw1rw2之间转发邮件 如果从exit发送A命令,则这两个goroutine可以正常关闭,以便rw2telnet server之间的连接首先关闭,A&lt; - &gt; {其次是{1}}。但是,如果我关闭A终端,这意味着仅rw1发送到EOFrw1&lt; - &gt; A连接可以在rw1&lt; rw2时关闭; - &gt; telnet server没有。第二个goroutine可以正常退出,而第一个goroutine仍然在io.Copy(rw1, rw2)处阻挡。 sourthConn.Close()也阻止了。{ 所以我的问题是如何在这种情况下进行第一次goroutine退出并sourth.Close()运行解锁?我提出了一个想法,即exit收到rw1之后在第二个goroutine中发送EOF命令,但我不知道这是否是一个好方法,这是否会带来错误:< / p>

go func() {
    _, err := io.Copy(rw2, rw1)
    rw2.Write([]byte("exit\n")) // add this sentence
    errc <- err
}()

如何直接从外部关闭*os.File

0 个答案:

没有答案