我遇到磁盘已满且程序挂起的情况,因为在 stdout 上使用了 fflush。我已经写了一个小代码来模拟这个问题。我们必须将这个程序的标准输出重定向到磁盘中已经满的文件。
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 一起用于标准输出。即使这样也行不通。请注意,我不能在此处使用 write 系统调用,但这可以避免磁盘已满时出现这种挂起问题。由于我的系统在许多地方广泛使用库调用,如果我只在这个地方使用 write 系统调用,它会以混合方式创建输出。谁能建议如何避免挂起?我也试过fsync,fdatasync。这些功能也一样。
Update: fcntl fixed this problem even with cout and fflush combination.