2017-03-26 56 views
3

EOF後讀我寫這將打開一個命名管道進行讀取,然後處理任何行寫入該管的程序:如何恢復在命名管道

err = syscall.Mkfifo("/tmp/myfifo", 0666) 
if err != nil { 
    panic(err) 
} 

pipe, err := os.OpenFile("/tmp/myfifo", os.O_RDONLY, os.ModeNamedPipe) 
if err != nil { 
    panic(err) 
} 

reader := bufio.NewReader(pipe) 
scanner := bufio.NewScanner(reader) 

for scanner.Scan() { 
    line := scanner.Text() 
    process(line) 
} 

這隻要正常工作的寫入過程不會重新啓動或由於其他原因發送EOF。發生這種情況時,循環終止(如從Scanner的規範中預期的那樣)。

但是,我想保持打開管道以接受進一步的寫入。我當時可能只是重新初始化掃描儀,但我相信這會創建一個競爭條件,即當新進程開始寫入管道時,掃描儀可能沒有準備好。

還有其他的選擇嗎?我是否需要直接使用File類型?

+0

您需要一臺新的掃描儀,哪裏會有比賽? – JimB

+0

@JimB我擔心的情況是編寫器斷開連接,我得到一個EOF並從循環中重新創建掃描器。在完成之前,作者已重新啓動並重新開始寫入管道。可能這隻會導致寫入被緩衝了嗎?我想這取決於是否需要關閉文件句柄。 – carlpett

回答

0

bufio GoDoc

掃描...當掃描停止時,即到達了輸入或錯誤的端部返回false。

所以你可能保留文件打開並閱讀直到EOF,然後觸發scanner.Scan()時,再次文件已更改或每隔一定的時間(即做一個夠程),並確保pipe變量不走超出範圍,以便您可以再次參考。

如果我正確理解您對競爭條件的擔憂,這不會是一個問題(除非寫入和讀取操作必須同步),但是當掃描器重新初始化時,它將最終返回到文件。

+0

同樣來自文檔:'掃描在EOF處不可恢復「 - 您不能再次調用掃描。 – JimB