当磁盘已满时,如何避免挂起stdout上的fflush?

时间:2013-05-07 05:13:13

标签: stdout fflush

我遇到磁盘已满且我的程序因为在stdout上使用fflush而挂起的情况。我已经放下了一个小代码来模仿这个问题。我们必须将这个程序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一起用于stdout。即便这样也不会起作用。请注意我不能在这里使用write系统调用虽然可以避免磁盘已满时出现这种挂起问题。由于我的系统在很多地方广泛使用库调用,如果我只在这个地方使用write系统调用,它将以混合方式创建输出。任何人都可以建议如何避免挂? 我也尝试过fsync,fdatasync。与这些功能一样悬而未决。

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

1 个答案:

答案 0 :(得分:1)

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

相关问题