child process

用 exec* 的方法時需注意:它們都是有 maxBuffer 限制的,因為會緩存輸出。

options - stdio

  1. 如果把多個 child 的 stdin 重定向到父進程,那么父進程控制臺的輸入將隨機給到某一個子進程中,而不是父進程控制臺的一次輸入會給到每一個子進程。
child = cp.spawn('grep', ['2333'], {
  stdio: [0, 1],
})

child2 = cp.spawn('grep', ['abbb'], {
  stdio: [0, 'pipe'],
})

child2.stdout.on('data', data => {
  console.log('===================data=====================', data.toString())
})
  1. pipe 參數含義是:Node 創建了一個 pipe,且傳遞給子進程的 fd 是該參數所在 stdio 中的數組下標。
// parent.js
const cp = require('child_process')
const child = cp.spawn('./child.js', [], {
  stdio: [0, 1, 2, 'pipe'],
})

// 在子進程中就可以使用文件描述符 3,來和父進程交流
child.stdio[3].on('data', data => console.log('parent receive: ', data.toString()))
// child.js
#!/Users/gangc/.nvm/versions/node/v4.8.3/bin/node

const fs = require('fs')
const out = fs.createWriteStream(null, { fd: 3 });
out.write('我是孩子\n')
  1. 可以在父子之間設置更多的文件描述符用于父子間交流,例如:
// parent.js
const cp = require('child_process')
const fs = require('fs')
const saveFile = fs.openSync('./save.txt', 'a')

const child = cp.spawn('./child.js', [], {
  stdio: [0, 1, 2, 'pipe', saveFile],
})
// child.js
#!/Users/gangc/.nvm/versions/node/v4.8.3/bin/node

const fs = require('fs')
const out = fs.createWriteStream(null, { fd: 4 });
out.write('我是孩子\n')
// save.text 就會添加一行 我是孩子

同步和異步的區別

  1. 同步方法返回的是子進程執行完后的結果,異步方法返回的是 Class: ChildProcess 的實例。
  2. 同步方法 execSyncexecFileSync 沒有回調。
  3. 同步方法特有的的 options.input 只有在子進程的 stdin 為 'pipe' 時才會被使用。

execFile 和 spawn 的區別

execFile 有回調,如果只關心子程序最后的輸出結果的話,使用它更簡單。而使用 spawn 的話還需要自己對子程序的輸出進行組裝。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容