一起读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 ,