2017-05-11 15 views
0

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

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文件超时?

回答

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,它的作用范围仅限于简化从例行程序返回多个值的功能

相关问题