2016-12-21 11 views
0

私のプログラムでos.Pipes()を使用していますが、何らかの理由で、書き込みや読み込みのたびにファイル記述子のエラーが発生します。メッセージの送受信にio.Pipes()を使用しています

私が間違っていることはありますか?以下は

コード

package main 

import (
    "fmt" 
    "os" 
) 

func main() { 

    writer, reader, err := os.Pipe() 
    if err != nil { 
     fmt.Println(err) 
    } 


    _,err= writer.Write([]byte("hello")) 


    if err != nil { 
     fmt.Println(err) 
    } 
    var data []byte 

    _, err = reader.Read(data) 


    if err != nil { 
     fmt.Println(err) 
    } 
    fmt.Println(string(data)) 
} 

出力されます: 書き込み| 0:無効な引数 読む| 1:無効な引数

答えて

4

あなたがからFIFO接続されているファイルのペアを返すos.Pipeを、使用していますos。これは、Goで実装されているio.Pipeとは異なります。

invalid argumentは、間違ったファイルを読み書きしているためです。 os.Pipeのシグネチャは、戻り値が順に「リーダ、ライタ、エラー」であることを示している

func Pipe() (r *File, w *File, err error) 

あります。

io.Pipe

func Pipe() (*PipeReader, *PipeWriter) 

はまた、あなたがos.Pipe関数からエラーをチェックすると、あなただけの値を印刷しているため、「リーダー、ライター」

に返します。エラーがあった場合、ファイルは無効です。そのエラーで戻るか終了する必要があります。

パイプもブロックされています(os.Pipeには小さなハードコーディングされたバッファがあります)ので、非同期に読み書きする必要があります。これをio.Pipeと交換した場合、すぐにデッドロックになります。読み込みメソッドをゴルーチンの中でディスパッチし、それが完了するのを待ちます。

最後に、何も読み取られないnilスライスに読んでいます。読み込む領域を割り当てる必要があります。バッファの使用量を知るために読み込まれたバイト数を記録する必要があります。

reader, writer, err := os.Pipe() 
if err != nil { 
    log.Fatal(err) 
} 

var wg sync.WaitGroup 
wg.Add(1) 
go func() { 
    defer wg.Done() 
    data := make([]byte, 1024) 

    n, err = reader.Read(data) 
    if n > 0 { 
     fmt.Println(string(data[:n])) 
    } 

    if err != nil && err != io.EOF { 
     fmt.Println(err) 
    } 
}() 

_, err = writer.Write([]byte("hello")) 
if err != nil { 
    fmt.Println(err) 
} 

wg.Wait() 
+0

どうもありがとう:

あなたの例のより適切なバージョンは次のようになります。戻り値の順序をチェックしていない、多くの時間を無駄にした。 – Pharaoh

関連する問題