如何玩转linux 子进程如何关闭child

用户名:雪飘七月
文章数:64
评论数:25
访问量:172227
注册日期:
阅读量:1297
阅读量:3317
阅读量:582821
阅读量:467725
51CTO推荐博文
& child_process是Node.js的一十分重要的模K,通^它可以F建多M程,以利用多核算Y源,同时方便管理各个子模块进程。
& Node.js 0.8的child_process模K提供了四建子M程的函担e是spawn,exec,execFile和fork。其中spawn是最原始的建子M程的函担渌都是spawn不同程度的封b。spawn只能\行指定的程序,敌枰诹斜碇薪o出,相於execvp系y函担exec可以直接\行}s的命令。
看下面spawn与exec的差异:
child&=&child_process.spawn('ls',&['-lh',&'/usr']);&child.stdout.setEncoding('utf8');&child.stdout.on('data',&function(data)&{&&&console.log(data);&});&
child_process.exec('ls&-lh&/usr',&function(err,&stdout,&stderr)&{&&&console.log(stdout);&});&
execFilecspawn的迪嗨疲残枰e指定绦械拿詈担梢越邮芤回{函担cexec的回{函迪嗤Kcexec的^e在於不营立的shell,因此相比更加p量。
fork函涤渺吨苯舆\行Node.js模K,例如fork(&./child.js&),相於spawn(&node&, ['./child.js'])。c默J的spawn不同的是,fork诟高M程c子M程直接建立一IPC管道,用於父子M程之g的通信。例如:
var&n&=&child_process.fork('./child.js');&n.on('message',&function(m)&{&&&console.log('PARENT&got&message:',&m);&});&n.send({&hello:&'world'&});&
child.js的内容:
process.on('message',&function(m)&{&&&console.log('CHILD&got&message:',&m);&});&process.send({&foo:&'bar'&});&
其中父M程{用fork函但@取一返回值,作子M程的句柄,通^send函蛋l送信息,on(&message&)O返回的信息,子M程通^戎玫processο笙嗤姆椒ㄅc父M程通信。
fork函涤幸},就是它只能\行JavaScript代a,如果你喜g用CoffeeScript(或者其他任何g到js的Z言),是o法通^fork{用的。一蔚姆椒ㄊ前汛ag到JavaScript再\行,但是很不方便,有]有什Nk法呢?答案是可以的,是得回到spawn函怠spawn函党私邮command, args外,接受一options怠Mㄟ^把options档stdioO['ipc'],即可在父子M程之g建立IPC管道。例如子M程使用CoffeeScript:
child_process&=&require('child_process')&options&=&&&stdio:&['ipc']&child&=&child_process.spawn&'coffee',&['./child.coffee'],&options&
其中只要把spawn的第一翟O置\行_本的解器,即可\行,例如使用,只需child = child_process.spawn(&continuation&, ['./child.coffee'], options)。
了这篇文章
类别:┆阅读(0)┆评论(0)君,已阅读到文档的结尾了呢~~
Nodejs进阶如何玩转子进程(childprocess)
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
Nodejs进阶如何玩转子进程(childprocess)
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口如何得知child_process退出 - CNode技术社区
这家伙很懒,什么个性签名都没有留下。
就是如果我希望通过自己的程序去调用npm init这样的进程
这就需要把自己和子进程之间的输入输出做一下pipe
process.stdin.pipe(child.stdin);
child.stdout.pipe(process.stdout);
其他方面都没问题,但是我如何知道npm init退出了呢?
目前的情况是进行到 Is this ok? (yes), 我敲回车之后,没有任何的事件被检测到了
我自己写了个简单的例子,用同样的方法去操作
var prompt = require('prompt');
prompt.start();
prompt.get(['username', 'email'], function (err, result) {
console.log('Command-line input received:');
console.log(' username: ' + result.username);
console.log(' email: ' + result.email);
process.exit(0);
这里,如果不执行process.exit(0),就会像刚才一样无法探测到。
而有了这句的话,我就可以
child.stdout.on('end', function() {});
child.on('exit',function(){});
从而在袭击的程序中调用process.exit()退出。
是不是有什么机制我不知道的?或者,node本身在没有process.exit(0)的时候如何知道在什么时候退出运行?
发现可以通过设置stdio选项为inherit来实现,顺带翻译了一下文档
child_process.spawn() 中的 stdio 选项是一个数组,每个索引对应子进程中的一个文件标识符。可以是下列值之一:
'pipe' -在子进程与父进程之间创建一个管道,管道的父进程端以 child_process 的属性的形式暴露给父进程,如 ChildProcess.stdio[fd]。
为 文件标识(fds) 0 - 2 建立的管道也可以通过 ChildProcess.stdin,ChildProcess.stdout 及 ChildProcess.stderr 分别访问。
'ipc' - 创建一个IPC通道以在父进程与子进程之间传递 消息/文件标识符。一个子进程只能有最多一个 IPC stdio 文件标识。
设置该选项激活 ChildProcess.send() 方法。如果子进程向此文件标识符写JSON消息,则会触发 ChildProcess.on(“message”)。
如果子进程是一个nodejs程序,那么IPC通道的存在会激活process.send()和process.on(‘message’)
'ignore' - 不在子进程中设置该文件标识。注意,Node 总是会为其spawn的进程打开 文件标识(fd) 0 - 2。
当其中任意一项被 ignored,node 会打开 /dev/null 并将其附给子进程的文件标识(fd)。
Stream 对象 - 与子进程共享一个与tty,文件,socket,或者管道(pipe)相关的可读或可写流。
该流底层(underlying)的文件标识在子进程中被复制给stdio数组索引对应的文件标识(fd)
正数 - 该整形值被解释为父进程中打开的文件标识符。他与子进程共享,和Stream被共享的方式相似。
null, undefined - 使用默认值。 对于stdio fds 0,1,2(或者说stdin,stdout和stderr),pipe管道被建立。对于fd 3及往后,默认为ignore
按照文档的意思,默认情况下,stdio的值为 [‘pipe’,‘pipe’,‘pipe’],作用就是让父进程可以拿到子进程的stdin,stdout,stderr,但具体作何操作,看具体需求。
如果是ignore,就拿不到这几对象。
而如果传Stream,则会在把子进程中的流复制给父进程达到同步的效果 (The stream’s underlying file descriptor is duplicated in the child process to the fd that corresponds to the index in the stdio array.)
不过我还是不太理解单纯的pipe与用stdio传递Stream当中有什么细微的差别。
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
服务器赞助商为
,存储赞助商为
,由提供应用性能服务。
新手搭建 Node.js 服务器,推荐使用无需备案的node.js(七) 子进程 child_process模块 - 求知的木头 - 博客园
众所周知node.js是基于单线程模型架构,这样的设计可以带来高效的CPU利用率,但是无法却利用多个核心的CPU,为了解决这个问题,node.js提供了child_process模块,通过多进程来实现对多核CPU的利用. child_process模块提供了四个创建子进程的函数,分别是spawn,exec,execFile和fork。
1.spawn函数的简单用法
spawn函数用给定的命令发布一个子进程,只能运行指定的程序,参数需要在列表中给出。如下示例:
var child_process = require('child_process');
var child = child_process.spawn( command );
child.stdout.on('data', function(data) {
console.log(data);
通过执行命令得到返回结果,我们就可以拿到标准输出流数据了。
2.exec函数的简单用法
exec也是一个创建子进程的函数,与spawn函数不同它可以直接接受一个回调函数作为参数,回调函数有三个参数,分别是err, stdout , stderr,基本使用方法如下:
var child_process = require('child_process');
child_process.exec( command , function(err, stdout , stderr ) {
console.log( stdout );
exec函数可以直接接受一个回调函数作为参数,回调函数有三个参数,分别是err, stdout,stderr,非常方便直接使用,
3.execFile函数的简单用法
execFile函数与exec函数类似,但execFile函数更显得精简,因为它可以直接执行所指定的文件,基本使用方法如下:
var child_process = require('child_process');
child_process.execFile( file , function(err, stdout , stderr ) {
console.log( stdout );
execFile与spawn的参数相似,也需要分别指定执行的命令和参数,但可以接受一个回调函数,与exec的回调函数相同。
4.fork函数的简单用法
fork函数可直接运行Node.js模块,所以我们可以直接通过指定模块路径而直接进行操作。使用方法如下:
var child_process = require('child_process');
child_process.fork( modulePath );
该方法是spawn()的特殊情景,用于派生Node进程。除了普通ChildProcess实例所具有的所有方法,所返回的对象还具有内建的通讯通道。
随笔 - 143

我要回帖

更多关于 父进程如何关闭子进程 的文章

 

随机推荐