0

我遇到磁盘已满且程序挂起的情况,因为在 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.
4

1 回答 1

1

您正在混合 C++ 流 I/O 和 C stdio 函数。如果需要,不要使用 fflush(stdout),而是使用 cout.flush()。与其检查 fflush 的返回码,不如检查 cout.good() 或使用 cout.rdstate()。我假设 cout 操作失败,但 fflush 不是看到失败的部分。

于 2013-05-07T05:30:02.930 回答