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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

spawn 和 exec 的区别(转载)

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

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

首先我們來(lái)看看官方API文檔中對(duì)它們的說(shuō)明:

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

command String將要運(yùn)行的命令。
args Array字符串參數(shù)數(shù)組。
options 配置對(duì)象:

cwd String子進(jìn)程的當(dāng)前工作目錄。
env Object環(huán)境變量鍵值對(duì)。
stdio Array|String子進(jìn)程的stdio配置。
detached Boolean這個(gè)子進(jìn)程將會(huì)變成進(jìn)程組的領(lǐng)導(dǎo)。
uid Number設(shè)置用戶(hù)進(jìn)程的ID。
gid Number設(shè)置進(jìn)程組的ID。

返回值:ChildProcess對(duì)象

利用給定的命令以及參數(shù)執(zhí)行一個(gè)新的進(jìn)程,如果沒(méi)有參數(shù)數(shù)組,那么args將默認(rèn)是一個(gè)空數(shù)組。

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

command String將要運(yùn)行的命令,參數(shù)使用空格隔開(kāi)。
options 配置對(duì)象:

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

callback Function 當(dāng)子進(jìn)程執(zhí)行完畢后將會(huì)執(zhí)行的回調(diào)函數(shù),參數(shù)有:

error Error
stdout Buffer
stderr Buffer

返回值:ChildProcess對(duì)象

在Shell中運(yùn)行一個(gè)命令,并緩存命令的輸出。

異同

從文檔里可以得出的一些相同點(diǎn):

1,它們都用于開(kāi)一個(gè)子進(jìn)程執(zhí)行指定命令。

2,它們都可以自定義子進(jìn)程的運(yùn)行環(huán)境。

3,它們都返回一個(gè)ChildProcess對(duì)象,所以他們都可以取得子進(jìn)程的標(biāo)準(zhǔn)輸入流,標(biāo)準(zhǔn)輸出流和標(biāo)準(zhǔn)錯(cuò)誤流 。

不同點(diǎn):

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

2,子進(jìn)程返回給Node的數(shù)據(jù)量:spawn沒(méi)有限制子進(jìn)程可以返回給Node的數(shù)據(jù)大小,而exec則在options配置對(duì)象中有maxBuffer參數(shù)限制,且默認(rèn)為200K,如果超出,那么子進(jìn)程將會(huì)被殺死,并報(bào)錯(cuò):Error:maxBuffer exceeded,雖然可以手動(dòng)調(diào)大maxBuffer參數(shù),但是并不被推薦。由此可窺見(jiàn)一番Node.js設(shè)置這兩個(gè)API時(shí)的部分本意,spawn應(yīng)用來(lái)運(yùn)行返回大量數(shù)據(jù)的子進(jìn)程,如圖像處理,文件讀取等。而exec則應(yīng)用來(lái)運(yùn)行只返回少量返回值的子進(jìn)程,如只返回一個(gè)狀態(tài)碼。

3,調(diào)用對(duì)象:雖然在官方文檔中,兩個(gè)方法接受的第一個(gè)參數(shù)標(biāo)注的都是command,即要執(zhí)行的命令,但其實(shí)不然。spawn接受的第一個(gè)參數(shù)為文件,而exec接受的第一個(gè)參數(shù)才是命令。在Node的源碼中關(guān)于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下直接運(yùn)行require('child_process').spawn('dir')會(huì)報(bào)異常說(shuō)沒(méi)有此文件,而使用exec則不會(huì)。若一定要使用spwan,則應(yīng)寫(xiě)成require('child_process').spawn('cmd.exe',['s', 'c', 'dir'])

4,回調(diào)函數(shù):exec方法相比spawn方法,多提供了一個(gè)回調(diào)函數(shù),可以更便捷得獲取子進(jìn)程輸出。這與為返回的ChildProcess對(duì)象的stdoutstderr監(jiān)聽(tīng)data事件來(lái)獲得輸出的區(qū)別在于:data事件的方式,會(huì)在子進(jìn)程一有數(shù)據(jù)時(shí)就觸發(fā),并把數(shù)據(jù)返回給Node。而回調(diào)函數(shù),則會(huì)先將數(shù)據(jù)緩存在內(nèi)存中(數(shù)據(jù)量小于maxBuffer參數(shù)),等待子進(jìn)程運(yùn)行完畢后,再調(diào)用回調(diào)函數(shù),并把最終數(shù)據(jù)交給回調(diào)函數(shù)。

轉(zhuǎn)載自:

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

總結(jié)

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。