2011-03-14 118 views
2

我有一個在兩個進程之間創建管道的程序。一個進程持續監視另一個進程的輸出,當遇到特定輸出時,它會通過其他管道輸入write()函數。我遇到的問題是,雖然管道的內容沒有通過其他進程的stdin流,直到我管道close()。我希望這個程序無限循環,並在每次遇到它正在尋找的輸出時作出反應。有沒有辦法在不關閉管道的情況下將輸入發送到其他進程?在C/C++中我想多次寫入同一個管道

我已經搜索了一下,發現命名管道可以在關閉它們後重新打開,但我想知道是否有另一個選項,因爲我已經編寫了使用未命名管道的代碼,但我還沒有學會使用命名管道。

+0

第一個過程如何寫入管道?如果它使用'fprintf()'等,那麼其輸出可能被緩衝。對'fflush()'的調用應該會通過數據。 – 2011-03-14 19:00:41

+0

它正在通過一條類似'write(pipe [1],string,strlen(string));'的線寫入管道。 'fflush()'看起來很有希望,我會試試看。 – Alex 2011-03-14 19:17:22

回答

2

你是如何看另一端的?你期待完整的字符串嗎?您不會在發佈的代碼段中發送終止NUL。也許發送strlen(字符串)+1字節將修復它。沒有看到代碼,很難說。

+0

管道的另一端是進入程序的stdin流,我沒有源代碼因此,基本上我創建了管道,分叉了一個新進程,在子進程中,我使用'dup2'將管道連接到'stdin'和'stdout'。我會嘗試你的建議並報告給我發現,感謝您的建議。 – Alex 2011-03-15 02:22:49

+0

非常感謝,您的建議讓我獲得瞭解決問題的大部分答案。輸入是一種命令行,所以我的問題是我沒有在最後使用換行符來模擬按下Enter鍵來提交命令。 – Alex 2011-03-15 02:40:36

+0

提到什麼代碼段? – 2015-03-05 08:22:49

4

看看使用fflush。    

+0

我讀了一下,你確定你可以在管道上使用'fflush'嗎?問題是輸入被壓入管道的緩衝區,然後坐在那裏,而不是被髮送到第二個進程的標準輸入。如果我使用'write(pipe [1],str,strlen(str));關閉(pipe [1]);'輸入將被髮送,但我似乎無法找到任何其他方式來發送。 'pipe [1]'是一個'integer',fflush以'FILE *'作爲參數,我不確定如何使用它。 – Alex 2011-03-14 19:28:07

+0

@Alex:如果我沒有記錯,整數是一個文件描述符,你可以用fdopen打開它。 http://stackoverflow.com/questions/650468/how-can-i-use-fprintf-and-write-to-a-pipe這可以是相當方便的,如果你想用管道使用fprintf之類的東西。 – GWW 2011-03-14 19:43:47

+0

我試過了,它使用fdopen編譯,但它仍然沒有將輸入推送到子進程。 – Alex 2011-03-14 20:07:10

1

使用fsync。 http://pubs.opengroup.org/onlinepubs/007908799/xsh/fsync.html

http://www.delorie.com/gnu/docs/glibc/libc_239.html: 一旦寫入返回,數據將被寫入隊列並立即讀回,但不一定立即寫入永久存儲區。當您需要確保您的數據已被永久存儲時,您可以使用fsync,然後再繼續。 (對於系統而言,批處理連續寫入操作更爲高效,並且在方便時一次完成所有操作,通常它們將在一分鐘或更短時間內寫入磁盤。)現代系統提供另一個函數fdatasync,該函數僅保證文件的完整性數據,因此速度更快。您可以使用O_FSYNC打開模式在寫入數據之前始終將數據存儲到磁盤。

+0

Fsync似乎也沒有做到這一點 – Alex 2011-03-14 19:57:44