2013-05-07 90 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