2012-05-23 54 views
0

我創建了一個名爲POSIX管道,說pipe_out,使用檢查管道狀態

mkfifo $path_tmp/pipe_out 

用C

打開
out_pipe = fopen(TMP_PATH "/pipe_out", "w"); 

,並使用fprintf中命令

fprintf(out_pipe,"%s",string); 

寫它我想我可以使用fprintf的返回值來檢查寫了多少,並將它與字符串的實際長度進行比較,以瞭解我f完整的字符串被寫入管道。然後,如果它是(過度)完整的,我暫停一下,然後嘗試在無盡的循環中再次寫入,從尚未寫入的內容開始...

這將看起來像詳細的內容,還有更多先進的方式,當管道滿時自動停止(暫停)fprintf。

回答

0

如果要主動檢測管道是否已滿,則使用fprintf()不是一個好主意,因爲它會在內部緩衝您的數據。

即使管道fd不再可寫,fprintf()將繼續返回,除非內部緩衝區也已滿。在這種情況下,它不會返回縮短的值,而是會阻塞,直到它可以寫入/緩衝整個字符串。

如果要檢測管道狀態,你不應該使用緩衝功能,但:

  • open()來打開FIFO /管
  • 選擇()測試文件描述符是可寫的
  • 寫()寫入字符串(返回值必須處理)