2011-10-17 49 views
1

在我的應用程序中,我創建了一堆子進程。在fork()之後,我打開每個進程文件,將創建的進程的stdout/stderr設置爲指向該文件,然後執行預期的程序。Linux - Disabing緩衝I/O到子進程中的文件

是否有一個父進程的選項設置的東西,使得當子進程執行printf時,它立即刷新到輸出文件而不必調用flush()?還是有一個API可以從子進程本身調用(執行前)以禁用緩衝I/O?

+0

請參閱setvbuf的手冊頁,您可以將stdout設置爲無緩衝。 stderr已經設置爲無緩衝。 –

回答

0

這裏的問題是printf被緩衝。底層文件描述符不以這種方式進行緩衝(它們緩存在內核中,但另一端可以從相同的內核緩衝區讀取)。您可以使用setvbuf更改緩衝區,如評論中所述,本應該是一個答案。

setvbuf(stdout, NULL, _IONBF, 0); 

你並不需要爲stdinstderr做到這一點。

您無法從父進程執行此操作。這是因爲緩衝區是由子進程創建的。父進程只能操作底層文件描述符(位於內核中),而不是stdout(它是C庫的一部分)。

P.S.您的意思是fflush,而不是flush

+0

這個答案大部分是正確的。除了「緩衝在內核中」。 stdio工具,'printf()'和'setvbuf()'是其中的一部分,在libc中被緩衝。緩衝在內核中是管道和fifo,但問題明確指出重定向到文件發生。 IOW,如果可以修改子進程,那麼應該在子進程的主開始處添加對stdout上的'setvbuf()'所提供的調用。 (默認情況下stderr沒有被緩衝。) – Dummy00001

+0

@ Dummy00001:除非您使用某種擴展名,如'O_DIRECT',否則在寫入之前它仍然會被磁盤緩衝。 –

+0

看起來像setvbuf()沒有保留在exec?我有這樣的東西.. if(fork()== 0){<打開臨時文件並將stdout/err重定向到此文件> setvbuf()exec()} printf調用execed代碼仍在緩衝中。 – Manohar