2013-05-07 76 views
0

我有一個情況,磁盤變滿,我的程序掛起,因爲在標準輸出使用fflush。我已經放下了一小段代碼來模仿這個問題。我們必須將這個程序stdout重定向到一個大小已滿的磁盤上的文件。如何避免在磁盤滿了時掛起stdout掛起?

while(1){ 
      cout << "a big data to be written here"; 
      int ret = fflush(stdout); 
      if(ret != 0){ 
        cerr << "get error : " << strerror(errno) << endl; 
        exit(1); 
      } 
} 

而這段代碼永遠掛起。我試圖使用fcntl與O_NONBLOCK進行標準輸出。即使這不起作用。請注意,我不能在這裏使用寫入系統調用,儘管這可以避免在磁盤已滿時出現此類掛起問題。由於我的系統在許多地方廣泛使用庫調用,如果我僅在此處使用寫入系統調用,它將以混合方式創建輸出。任何人都可以建議如何避免懸掛? 我試過fsync,fdatasync也是。與這些功能一樣懸而未決。

Update: fcntl fixed this problem even with cout and fflush combination. 
+0

這是什麼操作系統?你有沒有嘗試捕獲過程的['strace'](http://linux.die.net/man/1/strace)?此外,不要修復C++的stdio流或原始操作系統級文件訪問的iostreams。 – 2013-05-07 05:26:24

+0

它在unix上。是的,避免混淆,修復這個問題。謝謝 – 2013-05-07 06:44:27

回答

1

您在混合C++流I/O和C stdio函數。如果需要,可以不使用fflush(stdout),而使用cout.flush()。而不是檢查來自fflush的返回碼,而應檢查cout.good()或使用cout.rdstate()。我認爲cout操作失敗,但fflush不是看到失敗的部分。

+0

感謝cout.flush並檢查rdstate()運行良好 – 2013-05-07 06:46:50