我有一个情况,磁盘变满,我的程序挂起,因为在标准输出使用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.
这是什么操作系统?你有没有尝试捕获过程的['strace'](http://linux.die.net/man/1/strace)?此外,不要修复C++的stdio流或原始操作系统级文件访问的iostreams。 – 2013-05-07 05:26:24
它在unix上。是的,避免混淆,修复这个问题。谢谢 – 2013-05-07 06:44:27