在golang中打开超时的PE文件

时间:2017-05-11 23:47:25

标签: go timeout portable-executable goroutine

我想在Go中尝试打开一个超时的PE文件。为了实现这一点,我在引出文件指针和错误时使用匿名函数。我使用带有超时情况的select子句来强制执行超时,如下所示。

go func() {
    f, e := pe.Open(filePath)
    file <- f
    err <- e
}()

select {
case <-fileOpenTimeout:
    fmt.Printf("ERROR: Opening PE file timed out")
    return
case fileError := <-err:
    if fileError == nil{...}
}

此代码适用于我的用例。但是,如果文件打开时间太长,这可能会导致资源泄漏。我怎么能阻止这个?是否有更好的方法可以在打开PE文件时强制执行超时?

1 个答案:

答案 0 :(得分:0)

如果你有一个传递给匿名函数的完成频道,你可以用它来发送你早早结束的信号。

func asd() {
    fileOpenTimeout := time.After(5 * time.Second)

    type fileResponse struct {
        file *pe.File
        err error
    }

    response := make(chan fileResponse)
    done := make(chan struct{})

    go func(done <-chan struct{}) {
        f, e := pe.Open(filePath)
        r := fileResponse{
            file: f,
            err: e,
        }

        select {
        case response <- r:
            // do nothing, response sent
        case <-done:
            // clean up
            if f != nil {
                f.Close()
            }
        }
    }(done)

    select {
    case <-fileOpenTimeout:
        fmt.Printf("ERROR: Opening PE file timed out")
        close(done)
        return
    case r := <-response:
        if r.err != nil { ... }
    }
}

当完成通道关闭时,您将始终能够读取零值。所以你的匿名函数不会泄露。还有一个struct fileResponse,其范围仅限于简化从go例程中传回多个值的函数