2014-01-08 18 views
2

考慮以下Go代碼片段:大量數據寫入到exec.Command的()StdinPipe()錯誤

cmd := exec.Command(program, arg0) 
stdin, err := cmd.StdinPipe() 
// produces error when b is too large 
n, err := stdin.Write(b.Bytes()) 

每當b太大,Write()返回一個錯誤。經過了不同的大小b s的實驗,只要b的長度大於Linux管道緩衝區大小,就會發生這種情況。有沒有解決的辦法?本質上,我需要通過標準輸入將大型日誌文件提供給外部腳本。

+1

請顯示從寫入返回的錯誤。 – Volker

回答

1

我寫了這個程序來測試您的代碼:

package main 

import "os/exec" 
import "fmt" 


func main() { 
     cmd := exec.Command("/bin/cat") 

     in, _ := cmd.StdinPipe() 

     cmd.Start() 

     for i := 1024*1024; ; i += 1024*1024 { 
       b := make([]byte,i) 
       n, err := in.Write(b) 
       fmt.Printf("%d: %v\n", n, err) 
       if err != nil { 
         cmd.Process.Kill() 
         return 
       } 
     } 
} 

此程序會如果被叫進程關閉標準輸入錯誤是唯一的出路。您調用的程序是否關閉stdin?這可能是Go運行時中的一個錯誤。

+0

你在哪個平臺上運行? – Woot4Moo

+0

@ Woot4Moo我正在使用Linux。 – fuz

+0

我想更精確的是,哪個linux版本。 – Woot4Moo