管道

通过“child_process”模块fork出来的子进程都是返回一个ChildProcess对象实例,ChildProcess类比较特殊无法手动创建该对象实例,只能使用fork或者spawn,而且与process对象不同的是,ChildProcess实例的stdin为可写流,stdout和stderr为可读流。因此通过childprocess.stdin可以输入数据,通过childprocess.stdout可将子进程的数据数据输出到父进程中。

具体实现
var child = require('child_process')
, fs = require('fs');
var childProcess = child.exec(cmd, {env: process.env, maxBuffer: 20*1024*1024}, function(err) {
});
var stdoutStream = fs.createWriteStream(escape(stdoutFilePath));
childProcess.stdout.pipe(stdoutStream, {end: false});
childProcess.stderr.pipe(stdoutStream, {end: false});
// 使用node的后压机制
childProcess.stdout.pipe(process.stdout);
childProcess.stderr.pipe(process.stderr);
var stdoutEnded = false, stderrEnded = false; function tryClosing(){ if(stdoutEnded && stderrEnded){ stdoutStream.end(); } }
childProcess.stdout.on('end', function(){ stdoutEnded = true; tryClosing(); });
childProcess.stderr.on('end', function(){ stderrEnded = true; tryClosing(); });

这种方式适用于大多数场景,直接使用流特性完成子进程数据的输出。

文件检测

在某些系统的node环境下,“child_process”并未提供execSync特性,因此需要hack,这里参考shelljs的实现机制。

使用系统兼容较好的exec函数完成基本功能,在shell命令执行完毕后写入状态信息到某些临时文件,最后通过循环不断读取新写入该临时文件的数据。由于在shell命令执行过程中需要模拟同步效果,因此在循环中不仅仅获取新写入的数据,同时需要模拟I/O阻塞操作,此处shelljs的作者通过尝试所有的同步IO API,发现fs.writeFileSync操作可以较少的减轻CPU利用率,因此使用该函数阻塞I/O。

具体实现
var child = require('child_process')
, fs = require('fs');
var childProcess = child.exec('"+escape(cmd)+"', {env: process.env, maxBuffer: 20*1024*1024}, function(err) {
fs.writeFileSync('"+escape(codeFile)+"', err ? err.code.toString() : '0');
}); var previousStdoutContent = '';
// Echoes stdout changes from running process, if not silent
function updateStdout() {
if (options.silent || !fs.existsSync(stdoutFile))
return; var stdoutContent = fs.readFileSync(stdoutFile, 'utf8');
// No changes since last time?
if (stdoutContent.length <= previousStdoutContent.length)
return; process.stdout.write(stdoutContent.substr(previousStdoutContent.length));
previousStdoutContent = stdoutContent;
}

node中子进程同步输出的更多相关文章

  1. 144、Java链表之定义一个Node类并输出

    01.代码如下: package TIANPAN; class Node { // 每一个链表实际上就是由多个节点组成的 private String data; // 要保存的数据 private ...

  2. 配置 node.js 环境

    安装 Node.js 1. 下载 Node.js, 首先到官网 http://nodejs.org/download/ 的下载页面下载 Windows 版本, 这里有两种版本,推荐 .msi 的安装程 ...

  3. 用C++为nodejs 写组件,提高node处理效率

    昨天研究了下如何用C++和node交互,在node的程序中,如果有大数据量的计算,处理起来比较慢,可以用C++来处理,然后通过回调(callback的形式),返回给node. 首先,先来看看node ...

  4. CentOS上安装Node.js

    CentOS上安装Node.js [日期:2014-07-21] 来源:Linux社区  作者:maskdfe [字体:大 中 小]     CentOS上安装Node.js(想在Linux上学习No ...

  5. HW输入字符串长度,字符串,计数m。从前往后计数,当数到m个元素时,m个元素出列,同时将该元素赋值给m,然后从下一个数计数循环,直到所有数字都出列,给定的数全部为大于0的数字。输出出队队列。

    package huawei; import java.util.Scanner; public class 约瑟夫环 { private static class Node { public int ...

  6. Node.js V0.12新特性之性能优化

    v0.12悠长的开发周期(已经过去九个月了,并且还在继续,是有史以来最长的一次)让核心团队和贡献者们有充分的机会对性能做一些优化.本文会介绍其中最值得注意的几个. 支持塞住模式的可写流 现在可写流可以 ...

  7. Node.js快速入门

    Node.js是什么? Node.js是建立在谷歌Chrome的JavaScript引擎(V8引擎)的Web应用程序框架. 它的最新版本是:v0.12.7(在编写本教程时的版本).Node.js在官方 ...

  8. Node.js 安装 初体验(1)

    1.安装nodejs http://nodejs.org/download/  自动根据系统下载自己的版本node.js 2.环境变量 windows 安装,不需要配置环境变量   mac安装后,会提 ...

  9. 转:Node.js软肋之CPU密集型任务

    文章来自于:http://www.infoq.com/cn/articles/nodejs-weakness-cpu-intensive-tasks Node.js在官网上是这样定义的:“一个搭建在C ...

随机推荐

  1. Angular2入门系列教程3-多个组件,主从关系

    上一篇 Angular2项目初体验-编写自己的第一个组件 好了,前面简单介绍了Angular2的基本开发,并且写了一个非常简单的组件,这篇文章我们将要学会编写多个组件并且有主从关系 现在,假设我们要做 ...

  2. Java多线程基础学习(一)

    1. 创建线程    1.1 通过构造函数:public Thread(Runnable target, String name){}  或:public Thread(Runnable target ...

  3. “四核”驱动的“三维”导航 -- 淘宝新UI(需求分析篇)

    前言 孔子说:"软件是对客观世界的抽象". 首先声明,这里的"三维导航"和地图没一毛钱关系,"四核驱动"和硬件也没关系,而是为了复杂的应用而 ...

  4. HTML文档头部

    前面的话   在声明文档类型之后,HTML文档的下一部分为<html>标签,告知浏览器应将括在<html>...</html>内的所有内容解析为HTML.然后是HT ...

  5. Power BI官方视频(3) Power BI Desktop 8月份更新功能概述

    Power BI Desktop 8月24日发布了更新版本.现将更新内容翻译整理如下,可以根据后面提供的链接下载最新版本使用. 1.主要功能更新 1.1 数据钻取支持在线版 以前的desktop中进行 ...

  6. JavaScript模仿块级作用域

    avaScript 没有块级作用域的概念.这意味着在块语句中定义的变量,实际上是在包含函数中而非语句中创建的,来看下面的例子: function outputNumbers(count){ for ( ...

  7. EntityFramework.Extended 支持 MySql

    EntityFramework.Extended 默认不支持 MySql,需要配置如下代码: [DbConfigurationType(typeof(DbContextConfiguration))] ...

  8. C++随笔:从Hello World 探秘CoreCLR的内部(1)

    紧接着上次的问题,上次的问题其实很简单,就是HelloWorld.exe运行失败,而本文的目的,就是成功调试HelloWorld这个控制台应用程序. 通过我的寻找,其实是一个名为TryRun的文件出了 ...

  9. javascript之闭包理解以及应用场景

    半个月没写博文了,最近一直在弄小程序,感觉也没啥好写的. 之前读了js权威指南,也写了篇博文,但是实话实说当初看闭包确实还是一头雾水.现在时隔一个多月(当然这一段时间还是一直有在看闭包的相关知识)理解 ...

  10. web 前端(轮番插件)

    <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8& ...