日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

spawn 和 exec 的区别(转载)

發布時間:2023/12/19 综合教程 30 生活家
生活随笔 收集整理的這篇文章主要介紹了 spawn 和 exec 的区别(转载) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

眾所周知,Node.js在child_process模塊中提供了spawnexec這兩個方法,用來開啟子進程執行指定程序。這兩個方法雖然目的一樣,但是既然Node.js為我們提供了兩個方法,那它們之間必然還是會有一些不同之處,下面讓我們來分析一下他們的異同。

首先我們來看看官方API文檔中對它們的說明:

child_process.spawn(command[, args][, options])

command String將要運行的命令。
args Array字符串參數數組。
options 配置對象:

cwd String子進程的當前工作目錄。
env Object環境變量鍵值對。
stdio Array|String子進程的stdio配置。
detached Boolean這個子進程將會變成進程組的領導。
uid Number設置用戶進程的ID。
gid Number設置進程組的ID。

返回值:ChildProcess對象

利用給定的命令以及參數執行一個新的進程,如果沒有參數數組,那么args將默認是一個空數組。

child_process.exec(command[, options], callback)

command String將要運行的命令,參數使用空格隔開。
options 配置對象:

cwd String子進程的當前工作目錄。
env Object環境變量鍵值對。
encoding String字符編碼(默認: 'utf8')。
shell String將要執行命令的Shell(默認: 在UNIX中為/bin/sh, 在Windows中為cmd.exe, Shell應當能識別-c開關在UNIX中,或/s /cWindows中。 在Windows中,命令行解析應當能兼容cmd.exe)。
timeout Number超時時間(默認: 0)。
maxBuffer Number在stdout或stderr中允許存在的最大緩沖(二進制),如果超出那么子進程將會被殺死 (默認: 200*1024)。
killSignal String結束信號(默認:'SIGTERM')。
detached Boolean這個子進程將會變成進程組的領導。
uid Number設置用戶進程的ID。
gid Number設置進程組的ID。

callback Function 當子進程執行完畢后將會執行的回調函數,參數有:

error Error
stdout Buffer
stderr Buffer

返回值:ChildProcess對象

在Shell中運行一個命令,并緩存命令的輸出。

異同

從文檔里可以得出的一些相同點:

1,它們都用于開一個子進程執行指定命令。

2,它們都可以自定義子進程的運行環境。

3,它們都返回一個ChildProcess對象,所以他們都可以取得子進程的標準輸入流,標準輸出流和標準錯誤流 。

不同點:

1,接受參數的方式:spawn使用了參數數組,而exec則直接接在命令后。

2,子進程返回給Node的數據量:spawn沒有限制子進程可以返回給Node的數據大小,而exec則在options配置對象中有maxBuffer參數限制,且默認為200K,如果超出,那么子進程將會被殺死,并報錯:Error:maxBuffer exceeded,雖然可以手動調大maxBuffer參數,但是并不被推薦。由此可窺見一番Node.js設置這兩個API時的部分本意,spawn應用來運行返回大量數據的子進程,如圖像處理,文件讀取等。而exec則應用來運行只返回少量返回值的子進程,如只返回一個狀態碼。

3,調用對象:雖然在官方文檔中,兩個方法接受的第一個參數標注的都是command,即要執行的命令,但其實不然。spawn接受的第一個參數為文件,而exec接受的第一個參數才是命令。在Node的源碼中關于spawn的部分有如下一段:

var spawn = exports.spawn = function(file, args, options)

而在exec部分則有如下一段:

if (process.platform === 'win32') {
file = 'cmd.exe';
args = ['/s', '/c', '"' + command + '"'];
// Make a shallow copy before patching so we don't clobber the user's
// options object.
options = util._extend({}, options);
options.windowsVerbatimArguments = true;
} else {
  file = '/bin/sh';
  args = ['-c', command];
}

所以在Windows下直接運行require('child_process').spawn('dir')會報異常說沒有此文件,而使用exec則不會。若一定要使用spwan,則應寫成require('child_process').spawn('cmd.exe',['s', 'c', 'dir'])

4,回調函數:exec方法相比spawn方法,多提供了一個回調函數,可以更便捷得獲取子進程輸出。這與為返回的ChildProcess對象的stdoutstderr監聽data事件來獲得輸出的區別在于:data事件的方式,會在子進程一有數據時就觸發,并把數據返回給Node。而回調函數,則會先將數據緩存在內存中(數據量小于maxBuffer參數),等待子進程運行完畢后,再調用回調函數,并把最終數據交給回調函數。

轉載自:

Node.js中spawn與exec的異同比較

總結

以上是生活随笔為你收集整理的spawn 和 exec 的区别(转载)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。