Cha*_*had 13 c++ buffer cout stdout stream
为了更好地理解C++中的缓冲流,我想编写一个简单的程序,std::cout在终止之前不刷新缓冲区.由于我已经读取了std::cout在正常终止时刷新,我尝试抛出运行时错误.我也避免使用std::endl,据我所知,强制冲洗.第一次尝试:
//file noflush.cpp
#include <iostream>
int main() {
std::cout << "Don't write me to the console!";
throw 0;
}
Run Code Online (Sandbox Code Playgroud)
用g ++编译,从终端调用:
$ ./noflush
libc++abi.dylib: terminating with uncaught exception of type int
Don't write me to the console!Abort trap: 6
Run Code Online (Sandbox Code Playgroud)
即使我强制运行时出错,看起来缓冲区在终止时仍然会被刷新.是否有可能在缓冲区中"绑定"某些数据,使其不被写入设备?
eer*_*ika 10
这不是标准的c ++,但在POSIX中,你可以发送一个"kill"信号来杀死正在运行的进程.这将停止执行而不进行清理,例如刷新缓冲区.
编辑:我意识到信号不仅是POSIX,而且实际上是C标准库的一部分(并包含在C++标准库中).
#include <csignal>
// ...
std::cout << "Don't write me to the console!";
std::raise(SIGKILL);
Run Code Online (Sandbox Code Playgroud)
据我所知,没有符合标准的清洁方法,以避免std::cout对flush()之前的程序终止(但是,当然,你可以使用不洁的方法,例如,无论是发出信号,直接或间接地).根据cppreference,控制的实际缓冲区类型std::cout是实现定义但是派生自std::streambuf,它似乎不允许以模拟缓冲区静默吞咽的方式进行公共访问.
此外,正如我在评论中所指出的,甚至异常的程序终止(通过std::terminate()或std::abort()可能或可能不会关闭开放资源,因此这又是实现定义的.
| 归档时间: |
|
| 查看次数: |
1506 次 |
| 最近记录: |