相关疑难解决方法(0)

管道到三通时强制线缓冲标准输出

通常,stdout是行缓冲的.换句话说,只要您的printf参数以换行符结尾,您就可以立即打印该行.使用管道重定向时,这似乎不成立tee.

我有一个C++程序,a它输出字符串,总是被\n终止stdout.

当它由它自己运行时(./a),所有内容都在正确的时间正确打印,正如预期的那样.但是,如果我将它传递给tee(./a | tee output.txt),它会在它退出之前不会打印任何内容,这会使使用的目的失效tee.

我知道我可以通过fflush(stdout)在C++程序中的每次打印操作之后添加一个来修复它.但是有更清洁,更简单的方法吗?例如,是否有一个命令可以运行stdout,即使使用管道也会强行进行行缓冲?

unix buffer stdout pipe tee

103
推荐指数
5
解决办法
5万
查看次数

为什么stdout在重定向到文件时需要显式刷新?

行为printf()似乎取决于的位置stdout.

  1. 如果stdout发送到控制台,则printf()行缓冲并在打印换行符后刷新.
  2. 如果stdout被重定向到文件,则除非fflush()被调用,否则不刷新缓冲区.
  3. 此外,如果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 linux stdout

28
推荐指数
1
解决办法
1万
查看次数

动态获取另一个程序的输出作为输入

我有两个以这种方式使用的程序:

$ 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结束后获取其输入.

我怎么解决这个问题?

c python linux bash stdio

10
推荐指数
3
解决办法
7288
查看次数

强制shell脚本fflush

我想知道是否有可能告诉bash所有的调用echo或者printf应该分别跟随fflush()stdout/stderr 的后续调用?

一个快速而肮脏的解决方案是编写我自己的printf实现,并使用它来代替内置的,但它发生在我身上,我可能不需要.

我正在编写几个同时运行的构建脚本,为了调试需求,我真的需要看到它们按顺序写入的消息.

linux bash shell

10
推荐指数
1
解决办法
2万
查看次数

为什么我的Python脚本在Linux中背景时不写入文件?

我可以:

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)

我看不到对日志文件的任何更改.如何设置我的脚本并仍然将其写入日志文件?

python linux bash

6
推荐指数
1
解决办法
2009
查看次数

命令行中的异步管道

说我有两个命令:foo和bar.

我想执行这两个操作,使得foo的输出被"重定向"到bar的输入.不仅如此,我还希望写入foo输出流的每个字节直接/立即写入bar的输入流.

如果我使用命令:

foo | bar
Run Code Online (Sandbox Code Playgroud)

然后foo必须在bar开始读取其输入流之前终止/退出.我希望bar在foo写入其输出流的同时开始读取其输入流.

这里回答,如果我理解正确的话,指出存在由管道缓冲的字节数的限制,当他们充满对准管是"刷新"来也许这个限制可以减少到"栏的输入流不知何故?

linux bash

2
推荐指数
1
解决办法
622
查看次数

标签 统计

linux ×5

bash ×4

c ×2

python ×2

stdout ×2

buffer ×1

pipe ×1

shell ×1

stdio ×1

tee ×1

unix ×1