我想运行node.js作为子进程并提供输入 . 使用C,这是我的一些示例代码 .
我遇到的问题是虽然子进程的stdout仍然被定向到终端,但是在将子进程stdin输入打印'Hello World'行之后我什么也看不到 . 即使我fflush()管道,我在输出上看不到任何东西 . 但是,如果我关闭管道的输入,那么终端上会出现“Hello World” .
子进程似乎只是缓冲 - 为什么呢?我想最终将子进程stdout重定向到另一个管道并从main()读取它 .
int main(int argc,char * argv []){int toNode [2];
管(toNode);
pid_t child_pid = fork();
if(child_pid == 0){// child
//关闭写结束
关闭(toNode [1]);
//将read end连接到stdin
dup2(toNode [0],STDIN_FILENO);
//运行节点可执行文件
char * arg_list [] = {“/ usr / bin / node”,NULL};
execvp(arg_list [0],arg_list);
fprintf(stderr,“进程无法启动:%s \ n”,strerror(errno));
中止();
}
else {//父母
文件*流;
//关闭阅读结束
关闭(toNode [0]);
//将write fd转换为FILE对象
stream = fdopen(toNode [1],“w”);
fprintf(stream,“console.log('Hello World'); \ n”);
fflush(流);
//关闭(toNode [1]);
waitpid(child_pid,NULL,0);
}
返回0; }
1 回答
正在读取的管道没有问题 . 问题是
/usr/bin/node
默认情况下只调用REPL(read-eval-print循环),如果它检测到stdin
是交互式的 . 如果你有一个足够的nodejs
版本,那么你可以提供-i
或--interactive
命令行标志,但这不仅仅是在读取时执行每一行;它也可以充当控制台,包括在输出中插入ANSI颜色序列并打印每个表达式的值 .有关更多信息,请参见forum thread .