通常,stdout是行缓冲的.换句话说,只要您的printf参数以换行符结尾,您就可以立即打印该行.使用管道重定向时,这似乎不成立tee.
我有一个C++程序,a它输出字符串,总是被\n终止stdout.
当它由它自己运行时(./a),所有内容都在正确的时间正确打印,正如预期的那样.但是,如果我将它传递给tee(./a | tee output.txt),它会在它退出之前不会打印任何内容,这会使使用的目的失效tee.
我知道我可以通过fflush(stdout)在C++程序中的每次打印操作之后添加一个来修复它.但是有更清洁,更简单的方法吗?例如,是否有一个命令可以运行stdout,即使使用管道也会强行进行行缓冲?
行为printf()似乎取决于的位置stdout.
stdout发送到控制台,则printf()行缓冲并在打印换行符后刷新.stdout被重定向到文件,则除非fflush()被调用,否则不刷新缓冲区.printf()在stdout重定向到文件之前使用,则后续写入(对文件)是行缓冲的并在换行后刷新.何时进行stdout行缓冲,什么时候fflush()需要调用?
void RedirectStdout2File(const char* log_path) {
int fd = open(log_path, O_RDWR|O_APPEND|O_CREAT,S_IRWXU|S_IRWXG|S_IRWXO);
dup2(fd,STDOUT_FILENO);
if (fd != STDOUT_FILENO) close(fd);
}
int main_1(int argc, char* argv[]) {
/* Case 1: stdout is line-buffered when run from console */
printf("No redirect; printed immediately\n");
sleep(10);
}
int main_2a(int argc, char* argv[]) {
/* Case 2a: stdout is not line-buffered when …Run Code Online (Sandbox Code Playgroud) 我有两个以这种方式使用的程序:
$ c_program | python_program.py
Run Code Online (Sandbox Code Playgroud)
c_program使用printf()和python_program.py读取打印的东西sys.stdin.readline()
我想立即打印python_program.py进程c_program的输出,以便它可以打印自己的当前输出.不幸的是,python_program.py仅在c_program结束后获取其输入.
我怎么解决这个问题?
我想知道是否有可能告诉bash所有的调用echo或者printf应该分别跟随fflush()stdout/stderr 的后续调用?
一个快速而肮脏的解决方案是编写我自己的printf实现,并使用它来代替内置的,但它发生在我身上,我可能不需要.
我正在编写几个同时运行的构建脚本,为了调试需求,我真的需要看到它们按顺序写入的消息.
我可以:
python script.py > logfile 2>&1
Run Code Online (Sandbox Code Playgroud)
一旦我使用ctrl c杀死它,我可以看到日志文件的更改.但是,当我这样做时:
python script.py > logfile 2>&1 &
Run Code Online (Sandbox Code Playgroud)
我看不到对日志文件的任何更改.如何设置我的脚本并仍然将其写入日志文件?
说我有两个命令:foo和bar.
我想执行这两个操作,使得foo的输出被"重定向"到bar的输入.不仅如此,我还希望写入foo输出流的每个字节直接/立即写入bar的输入流.
如果我使用命令:
foo | bar
Run Code Online (Sandbox Code Playgroud)
然后foo必须在bar开始读取其输入流之前终止/退出.我希望bar在foo写入其输出流的同时开始读取其输入流.
这这里回答,如果我理解正确的话,指出存在由管道缓冲的字节数的限制,当他们充满对准管是"刷新"来也许这个限制可以减少到"栏的输入流不知何故?