通過「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, , function(err) );
var stdoutstream = fs.createwritestream(escape(stdoutfilepath));
childprocess.stdout.pipe(stdoutstream, );
childprocess.stderr.pipe(stdoutstream, );
// 使用node的後壓機制
childprocess.stdout.pipe(process.stdout);
childprocess.stderr.pipe(process.stderr);
var stdoutended = false, stderrended = false;
function tryclosing() }
childprocess.stdout.on('end', function());
childprocess.stderr.on('end', function());
這種方式適用於大多數場景,直接使用流特性完成子程序資料的輸出。
在某些系統的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)+"', , function(err) );
var previousstdoutcontent = '';
// echoes stdout changes from running process, if not silent
function updatestdout()
程序同步(一) 程序同步相關概念
在os中引入程序後,雖然提高了資源的利用率和系統吞吐量,但是由於程序的非同步性將會給系統造成混亂,尤其是他們在爭搶臨界資源時。當多個程序去爭用共享變數 鍊錶時,可能導致資料處理出錯。程序同步的任務就是對多個相關程序在執行次序上進行協調,使得併發執行的程序之間能有效地共享資源和相互合作,從而使程式的執...
Linux程序同步
linux程序同步 概述 程序間通訊 ipc 方法主要有以下幾種 管道 fifo 共享記憶體 訊息佇列 訊號量 1.管道中還有命名管道和非命名管道 即匿名管道 之分,非命名管道 即匿名管道 只能用於父子程序通訊,命名管道可用於非父子程序,命名管道就是fifo,管道是先進先出的通訊方式 2.訊息佇列是...
程序同步問題
有讀者和寫者兩組併發程序,共享乙個檔案,當兩個或以上的讀程序同時訪問共享資料時不會產生 但若某個寫程序和其他程序 讀程序或寫程序 同時訪問共享資料時則可能導致資料不一致的錯誤。因此要求 允許多個讀者可以同時對檔案執行讀操作 只允許乙個寫者往檔案中寫資訊 任一寫者在完成寫操作之前不允許其他讀者或寫者工...