<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                child_process模塊用于新建子進程。子進程的運行結果儲存在系統緩存之中(最大200KB),等到子進程運行結束以后,主進程再用回調函數讀取子進程的運行結果。 [TOC] ## exec() exec方法用于執行bash命令。 ~~~ var exec = require('child_process').exec; var ls = exec('ls -l', function (error, stdout, stderr) { if (error) { console.log(error.stack); console.log('Error code: '+error.code); } console.log('Child Process STDOUT: '+stdout); }); ~~~ 上面代碼的exec方法用于新建一個子進程,然后緩存它的運行結果,運行結束后調用回調函數。 exec方法的第一個參數是所要執行的shell命令,第二個參數是回調函數,該函數接受三個參數,分別是發生的錯誤、標準輸出的顯示結果、標準錯誤的顯示結果。 由于標準輸出和標準錯誤都是流對象(stream),可以監聽data事件,因此上面的代碼也可以寫成下面這樣。 ~~~ var exec = require('child_process').exec; var child = exec('ls -l'); child.stdout.on('data', function(data) { console.log('stdout: ' + data); }); child.stderr.on('data', function(data) { console.log('stdout: ' + data); }); child.on('close', function(code) { console.log('closing code: ' + code); }); ~~~ 上面的代碼還表明,子進程本身有close事件,可以設置回調函數。 上面的代碼還有一個好處。監聽data事件以后,可以實時輸出結果,否則只有等到子進程結束,才會輸出結果。所以,如果子進程運行時間較長,或者是持續運行,第二種寫法更好。 下面是另一個例子,假定有一個child.js文件。 ~~~ // child.js var exec = require('child_process').exec; exec('node -v', function(error, stdout, stderr) { console.log('stdout: ' + stdout); console.log('stderr: ' + stderr); if (error !== null) { console.log('exec error: ' + error); } }); ~~~ 運行后,該文件的輸出結果如下。 ~~~ $ node child.js stdout: v0.11.14 stderr: ~~~ exec方法會直接調用bash(`/bin/sh`程序)來解釋命令,所以如果有用戶輸入的參數,exec方法是不安全的。 ~~~ var path = ";user input"; child_process.exec('ls -l ' + path, function (err, data) { console.log(data); }); ~~~ 上面代碼表示,在bash環境下,`ls -l; user input`會直接運行。如果用戶輸入惡意代碼,將會帶來安全風險。因此,在有用戶輸入的情況下,最好不使用exec方法,而是使用execFile方法。 ## execFile() execFile方法直接執行特定的程序,參數作為數組傳入,不會被bash解釋,因此具有較高的安全性。 ~~~ var child_process = require('child_process'); var path = "."; child_process.execFile('/bin/ls', ['-l', path], function (err, result) { console.log(result) }); ~~~ 上面代碼中,假定path來自用戶輸入,如果其中包含了分號或反引號,ls程序不理解它們的含義,因此也就得不到運行結果,安全性就得到了提高。 ## spawn() spawn方法創建一個子進程來執行特定命令,用法與execFile方法類似,但是沒有回調函數,只能通過監聽事件,來獲取運行結果。它屬于異步執行,適用于子進程長時間運行的情況。 ~~~ var child_process = require('child_process'); var path = '.'; var ls = child_process.spawn('/bin/ls', ['-l', path]); ls.stdout.on('data', function (data) { console.log('stdout: ' + data); }); ls.stderr.on('data', function (data) { console.log('stderr: ' + data); }); ls.on('close', function (code) { console.log('child process exited with code ' + code); }); ~~~ spawn方法接受兩個參數,第一個是可執行文件,第二個是參數數組。 spawn對象返回一個對象,代表子進程。該對象部署了EventEmitter接口,它的data事件可以監聽,從而得到子進程的輸出結果。 spawn方法與exec方法非常類似,只是使用格式略有區別。 ~~~ child_process.exec(command, [options], callback) child_process.spawn(command, [args], [options]) ~~~ ## fork() fork方法直接創建一個子進程,執行Node腳本,`fork('./child.js')`?相當于?`spawn('node', ['./child.js'])`?。與spawn方法不同的是,fork會在父進程與子進程之間,建立一個通信管道,用于進程之間的通信。 ~~~ var n = child_process.fork('./child.js'); n.on('message', function(m) { console.log('PARENT got message:', m); }); n.send({ hello: 'world' }); ~~~ 上面代碼中,fork方法返回一個代表進程間通信管道的對象,對該對象可以監聽message事件,用來獲取子進程返回的信息,也可以向子進程發送信息。 child.js腳本的內容如下。 ~~~ process.on('message', function(m) { console.log('CHILD got message:', m); }); process.send({ foo: 'bar' }); ~~~ 上面代碼中,子進程監聽message事件,并向父進程發送信息。 ## send() 使用 child_process.fork() 生成新進程之后,就可以用 child.send(message, [sendHandle]) 向新進程發送消息。新進程中通過監聽message事件,來獲取消息。 下面的例子是主進程的代碼。 ~~~ var cp = require('child_process'); var n = cp.fork(__dirname + '/sub.js'); n.on('message', function(m) { console.log('PARENT got message:', m); }); n.send({ hello: 'world' }); ~~~ 下面是子進程sub.js代碼。 ~~~ process.on('message', function(m) { console.log('CHILD got message:', m); }); process.send({ foo: 'bar' }); ~~~ ## 參考鏈接 * Lift Security Team,?[Avoiding Command Injection in Node.js](https://blog.liftsecurity.io/2014/08/19/Avoid-Command-Injection-Node.js): 為什么execFile()的安全性高于exec() * Krasimir Tsonev,?[Node.js: managing child processes](http://tech.pro/tutorial/2074/nodejs-managing-child-processes) * byvoid,?[Node.js中的child_process及進程通信](https://www.byvoid.com/zhs/blog/node-child-process-ipc): exec()、execFile()、fork()、spawn()四種方法的簡介
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看