除非在终端中运行,否则C ++程序不会写入/ dev / stdout

时间:2019-02-14 12:41:04

标签: c++ stdout flush

我确定这个问题是愚蠢的,但是我对C ++不熟悉。不好意思。

我正在使用dvbjet,这是一个用C ++编写的开源程序。它旨在连续写入文件,可以通过命令行参数指定其路径。但出于我的目的,我想将dvbjet的输出读取到NodeJS脚本中。我最初尝试使用命名管道,但是命名管道在NodeJS中确实无法正常工作。所以我想将dvbjet输出输出到stdout而不是文件。

当我启动dvbjet时(使用Node的child_process),我传入/ dev / stdout作为输出文件路径。但是在NodeJS中,我再也看不到任何来自子进程stdout的数据。如果我使用node-pty(模拟tty)来启动它,则会得到输出,但是可悲的是,node-pty将输出转换为字符串,然后将其转换回二进制(使用Buffer.from(str, 'utf8') )数据已损坏。

因此,如果我使用/ dev / stdout作为终端运行程序,则它可以正常工作。但是,如果我不是终端,则没有输出。我怀疑它正在缓冲中而不被刷新。

我正在尝试编辑dvbjet以确保其刷新标准输出,但是因为我不知道自己在做什么,所以这是一个挑战。我还试图对程序进行尽可能少的更改,并确保在输出到常规文件时它仍然可以正常工作。

当前,dvbjet像这样打开文件:

open(outputFile.c_str(), O_WRONLY | O_CREAT | O_TRUNC | O_APPEND, 0664

并这样写:

write(fd, buffer->start(), buffer->length());

我尝试在flush(stdout);调用之后添加write(),但没有任何区别。我不确定是否可以为此使用std :: flush,因为dvbjet没有使用std ostream。

我还尝试使用this blog post中所述的stdbuf命令,但没有成功。

我尝试将setbuf(stdout, NULL);放在main的开头,也没有运气。

通过使用相同的代码运行echo hi并检查是否已检测到stdout,我检查了问题是否出在我的NodeJS脚本上。

我尝试添加以下内容:

fwrite(buffer->start(), 1, buffer->length(), stdout);
fflush(stdout);

但是它仍然不会写到stdout。看来问题并不特定于在/ dev / stdout中使用write()。我真的不知道现在要看哪里。

编辑:进一步研究之后,似乎在/ dev / stdout上运行时,open调用或write调用都会阻塞。因此,我之后尝试进行的刷新测试无法正常工作,因为该代码从未执行过。

0 个答案:

没有答案