当前位置:编程学习 > JS >>

一起读nodejs(五)----进程(process)

 进程(process)

    process对象是一个全局对象,它可以在任何地方被访问.它是一个EventEmitter对象的实例.

    Event:'exit'

    当一个进程即将退出时放出'exit'事件,这一个用来定时检查模块的状态的好钩子(hook)(例如单元测试),当主事件循环在执行完'exit'的回调函数后将不再执行,所以在exit事件中定义的定时器可能不会被加入事件列表.

    监听'exit'事件的例子:

[javascript] 
<SPAN style="FONT-SIZE: 18px; FONT-FAMILY: FangSong_GB2312">process.on('exit', function () { 
  process.nextTick(function () { 
   console.log('This will not run'); 
  }); 
  console.log('About to exit.'); 
});</SPAN> 

process.on('exit', function () {
  process.nextTick(function () {
   console.log('This will not run');
  });
  console.log('About to exit.');
});   

    Event:'uncaughtException'


    当一个异常冒泡循环一圈又回到node事件循环时放出'uncaughtException'.如果这个异常被添加了一个监听器,默认操作(打印堆栈信息并退出)将不会执行.

    监听'uncaughtException'事件的例子:

[javascript] 
<SPAN style="FONT-SIZE: 18px; FONT-FAMILY: FangSong_GB2312">process.on('uncaughtException', function (err) { 
  console.log('Caught exception: ' + err); 
}); 
 
setTimeout(function () { 
  console.log('This will still run.'); 
}, 500); 
 
// Intentionally cause an exception, but don't catch it.  
nonexistentFunc(); 
console.log('This will not run.');</SPAN> 

process.on('uncaughtException', function (err) {
  console.log('Caught exception: ' + err);
});

setTimeout(function () {
  console.log('This will still run.');
}, 500);

// Intentionally cause an exception, but don't catch it.
nonexistentFunc();
console.log('This will not run.');    注意:uncaughtException是一个很低级的异常处理,在将来可能被移除.

    不要使用它,用domains代替(后面会讲),如果你非用不可,只好每次在程序发生异常之后重启.

    不要把它和'On Error Resume Next'一起用,因为一个未处理的异常意味着你的程序--甚至是node.js自己--在一个未定义的状态.盲目的恢复继续执行疑问这任何事都可能发生.

    想像一下,在你正在升级你的系统的时候拉扯主机电源线,十有八九可能什么都不会发生--但是第十次,你的系统会瘫痪.

    你已经被警告过了.

 


    信号事件(signal Events)

    当进程接受到一个信号时发出'singal'事件.可以使用sigaction(2)(linux系统下)查看标准的posix 信号命名列表,例如:SIGINT,SIGUSR1,等等.

    监听'signal'事件的例子:

[javascript] 
<SPAN style="FONT-SIZE: 18px; FONT-FAMILY: FangSong_GB2312">// Start reading from stdin so we don't exit.  
process.stdin.resume(); 
 
process.on('SIGINT', function () { 
  console.log('Got SIGINT.  Press Control-D to exit.'); 
});</SPAN> 

// Start reading from stdin so we don't exit.
process.stdin.resume();

process.on('SIGINT', function () {
  console.log('Got SIGINT.  Press Control-D to exit.');
});    一个简单的方式发送SIGINT信号的方法是:control-c,在大多是终端程序里.

   

    process.stdout

    一个可以写道stdout的流

    例子:console.log的定义:

console.log = function (d) {
  process.stdout.write(d + '\n');
};
    process.stderr和process.stdout在node中是和其他流不一样在往这些流里写东西时是阻塞的.这些阻塞的流需要索引常规文件或者tty文件描述.而process.stderr和process.stdout是索引管道,他们不像其他流一样阻塞.

   

    process.stdin

    标准输入流是一个可读的流,stdin流默认是暂停状态,所以想要从stdin读取必须要调用一次process.stdin.resume();

    打开stdin和监听两个事件的例子:

[javascript] 
<SPAN style="FONT-SIZE: 18px; FONT-FAMILY: FangSong_GB2312">process.stdin.resume(); 
process.stdin.setEncoding('utf8'); 
 
process.stdin.on('data', function (chunk) { 
  process.stdout.write('data: ' + chunk); 
}); 
 
process.stdin.on('end', function () { 
  process.stdout.write('end'); 
});</SPAN> 

process.stdin.resume();
process.stdin.setEncoding('utf8');

process.stdin.on('data', function (chunk) {
  process.stdout.write('data: ' + chunk);
});

process.stdin.on('end', function () {
  process.stdout.write('end');
});


    process.argv

    一个包含命令行参数的数组.第一个元素将会是"node",第二个参数将会是一个javascript文件的名字,后面的元素将会是一些附加的命令行参数.

[javascript] 
<SPAN style="FONT-SIZE: 18px; FONT-FAMILY: FangSong_GB2312">// print process.argv  
process.argv.forEach(function (val, index, array) { 
  console.log(index + ': ' + val); 
});</SPAN> 

// print process.argv
process.argv.forEach(function (val, index, array) {
  console.log(index + ': ' + val);
});这将会产生:[javascript] view plaincopyprint?
<SPAN style="FONT-SIZE: 18px; FONT-FAMILY: FangSong_GB2312">$ node process-2.js one two=three four 
0: node 
1: /Users/mjr/work/node/process-2.js 
2: one 
3: two=three 
4: four</SPAN> 

$ node process-2.js one two=three four
0: node
1: /Users/mjr/work/node/process-2.js
2: one
3: two=three
4: four   

    process.execPath


    这是启动进程的可执行程序的绝对路径.

    例子:

[javascript] 
<SPAN style="FONT-SIZE: 18px; FONT-FAMILY: FangSong_GB2312">/usr/local/bin/node</SPAN> 

/usr/local/bin/node   

    process.abort()


    这将引起node发出一个abort事件,将会引起node退出并生成一个核心文件.

   

    process.chdir(directory)

    改变当前进程的工作目录,如果失败会放出一个异常.

[javascript] 
<SPAN style="FONT-SIZE: 18px; FONT-FAMILY: FangSong_GB2312">console.log('Starting directory: ' + process.cwd()); 
try { 
  process.chdir('/tmp'); 
  console.log('New directory: ' + process.cwd()); 

catch (err) { 
  console.log('chdir: ' + err); 
}</SPAN> 

console.log('Starting directory: ' + process.cwd());
try {
  process.chdir('/tmp');
  console.log('New directory: ' + process.cwd());
}
catch (err) {
  console.log('chdir: ' + err);
}   

&

补充:web前端 , JavaScript ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,