首页 文章

管道没有被子进程读取?

提问于
浏览
1

我想运行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 回答

  • 2

    正在读取的管道没有问题 . 问题是 /usr/bin/node 默认情况下只调用REPL(read-eval-print循环),如果它检测到 stdin 是交互式的 . 如果你有一个足够的 nodejs 版本,那么你可以提供 -i--interactive 命令行标志,但这不仅仅是在读取时执行每一行;它也可以充当控制台,包括在输出中插入ANSI颜色序列并打印每个表达式的值 .

    有关更多信息,请参见forum thread .

相关问题