C 子进程未读取管道?
我想将node.js作为子流程运行,并将其输入。使用C,下面是我的一些示例代码 我遇到的问题是,尽管子进程的stdout仍然指向终端,但在向子进程stdin输入打印的“helloworld”行后,我什么也看不到。即使我对管道进行了fflush()操作,我也看不到任何输出。但是,如果关闭管道的输入,则“Hello World”将显示在终端上 子流程似乎只是缓冲-为什么? 我希望最终将子流程stdout重定向到另一个管道并读取它 从main()导入 int main(int argc,char*argv[]){C 子进程未读取管道?,c,linux,node.js,process,pipe,C,Linux,Node.js,Process,Pipe,我想将node.js作为子流程运行,并将其输入。使用C,下面是我的一些示例代码 我遇到的问题是,尽管子进程的stdout仍然指向终端,但在向子进程stdin输入打印的“helloworld”行后,我什么也看不到。即使我对管道进行了fflush()操作,我也看不到任何输出。但是,如果关闭管道的输入,则“Hello World”将显示在终端上 子流程似乎只是缓冲-为什么? 我希望最终将子流程stdout重定向到另一个管道并读取它 从main()导入 int main(int argc,char*ar
正在读取的管道没有问题。问题是
/usr/bin/node
只调用REPL(read-eval-print循环),默认情况下,如果它检测到stdin
是交互式的。如果您有足够新版本的nodejs
,则可以提供-i
或--interactive
命令行标志,但这将不仅仅是在读取每一行时执行它;它实际上还将充当控制台,包括插入将SI颜色序列输入输出并打印每个表达式的值
有关更多信息,请参阅此部分。虽然提到Python,但这是相同的基本问题。您必须以某种方式说服其他程序减少缓冲。(我不知道是否可以让node.js这样做,或者是否需要使用伪TTY。)
int toNode[2];
pipe(toNode);
pid_t child_pid = fork();
if (child_pid == 0) { // child
// close write end
close(toNode[1]);
// connect read end to stdin
dup2(toNode[0], STDIN_FILENO);
// run node executable
char* arg_list[] = { "/usr/bin/node", NULL};
execvp(arg_list[0], arg_list);
fprintf(stderr, "process failed to start: %s\n", strerror(errno));
abort();
}
else { // parent
FILE* stream;
// close read end
close(toNode[0]);
// convert write fd to FILE object
stream = fdopen(toNode[1], "w");
fprintf(stream, "console.log('Hello World');\n");
fflush(stream);
//close(toNode[1]);
waitpid(child_pid, NULL, 0);
}
return 0; }