我确定这个问题是愚蠢的,但是我对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调用都会阻塞。因此,我之后尝试进行的刷新测试无法正常工作,因为该代码从未执行过。