2013-07-17 127 views
0

我試圖讓我的頭在OSX/Linux中的管道。我有一個名爲foo的實用程序。我希望它解析任何我從其他任意實用程序中輸入的輸入,並在沒有輸入時退出。我正在閱讀cin的內容,如果我將某些內容傳遞給foo,那麼它的工作正常。但是,如果我沒有將任何內容傳送給foo,則讀取到cin會無限期地阻止。閱讀管道輸入

顯然我做錯了什麼/愚蠢的。什麼是正確的方式去做這件事?

+1

您是否嘗試過用鍵盤輸入輸入並在完成後輸入cntr + d? – hetepeperfan

+0

阻塞是從標準輸入讀取的程序的預期行爲。嘗試運行沒有參數的'cat',你會發現它具有相同的行爲。也請嘗試@hetepeperfan建議的內容,這是用戶在這些情況下所期望的。 – syam

+0

我已經採取了上述建議,只是複製了「貓」實用程序的行爲。它不能解決問題,但我可以忍受它。謝謝syam。 – Daniel

回答

1

這取決於你想要做什麼。如果您想在輸入結束運行時退出,請檢查標準輸入是否仍在工作。當輸入程序終止時,它將得到一個EOF。

while (cin.good()) { 
    cin << whatever; 
    ... 
} 

但是,如果您不想等到輸入程序終止,那麼您可能需要等待一段時間。最簡單的方法是在文件描述符0上使用select(),然後只在有數據時纔讀取,如果超時則結束。或者,如果你想用C++的方式,我推薦Boost Asio。您可以使用posix::stream_descriptor處理Posix系統下的本機文件描述符。

+0

嗨,彼得。感謝您使用select的建議。儘管在這種情況下采取了syam的建議,但它似乎解決了我的問題。另外,我在這個過程中學到了一些關於文件描述符的知識。謝謝! – Daniel