如果你用过Node.jsAPI,你会不会奇怪为什么API的名字是这样的:比如创建一个目录:constfs=require('fs');fs.mkdir('/a/b/c',{recursive:true},(err)=>{if(err)throwerr;});创建进程:constchildProcess=require('child_process');childProcess。fork('a/b/c.js');childProcess.execFile('a/b/dddd');childProcess.exec('"/path/to/testfile/test.sh"arg1arg2');childProcess.spawn('ls',['-lh','/usr']);mkdir、fork、exec、spawn等等,这些名字是怎么来的呢?如果你用过linux命令或者c函数库,你会发现这些api也是command和c函数库中的名字。为什么会这样?这些API的标准是什么?是的,这是POSIX标准。什么是POSIX?POSIX是portableoperatingsysteminterface(便携式操作系统接口)的缩写,x表示unix,是从unix继承过来的。因为如果不同的操作系统提供的功能和系统调用不同,那么基于该操作系统的上层应用程序的源代码是不同的,从而导致在一个平台上编写的代码无法在另一个平台上编译.我们应该做什么?如果每个操作系统提供的API都相同怎么办?不管操作系统底层如何实现这些能力,只需要将相同的API暴露给应用程序即可,做到源码跨平台,在不同的操作系统编译后即可运行。这个统一操作系统暴露的API标准就是POSIX。这个POSIX标准可以理解为ts中定义的一个接口,只要实现这个接口的API兼容POSIX标准即可。POSIX最初是Unix的扩展。Linux实现了这个POSIX标准。后来迫于压力,Windows不得不兼容POSIX标准。否则,许多Linux应用程序将无法在Windows上运行。我们常用的osx也是。因此,POSIX是操作系统向上层应用程序提供能力的一些标准接口,包括系统调用、c函数库、shell命令等。所谓标准就是ISO国际标准化组织所承认的,它是一个国际组织,成员遍布各个国家,是制定各种国际标准的组织。POSIX是ISO/IEC9945标准(IEC是电子标准化组织)。事实上,POSIX是由IEEE提出的。这是一个美国标准化组织。他提出的标准如果被ISO认可,将成为国际标准。比如POSIX就是他们提出的IEEEStd1003标准。现已被ISO认可,成为ISO/IEC9945标准。POSIX的内容有哪些我们来看看支持POSIX的Linux都提供了哪些系统调用(系统调用是指内核代码中提供的程序):进程控制:fork创建新进程execv运行可执行文件exit终止进程文件readwriteopen打开文件close关闭文件描述符writewritethefilereadreadfiletruncatetruncatethefilefsyncwritethepartofthefileinmemorytothediskfilesystemrelatedaccess判断文件是否可访问chdir改变当前工作directorychown更改文件的所有者或用户组stat获取文件状态信息mkdir创建目录symlink创建符号链接unlink删除链接等。其中许多系统调用在Node.js中具有同名API,以及同名命令在shell中:例如:fs.statsfs.accessfs.chownfs.mkdirfs。openfs.closefs.readfs.writechild_process.forkchild_process.execchild_process.execFile等Node.jsapi特性Node.js是一个js运行时,基于v8注入很多提供操作系统能力的API给js调用,以及这些api的设计其中许多是直接使用POSIX标准api名称,没有太多抽象。Java的JRE(javaruntime)也提供了对操作系统能力的抽象,但是那些API与操作系统POSIX的API关系不大,并且融入了很多设计模式,比如io流的装饰器模式。Node.jsAPI的特点是抽象不多,很多API名称类似于Linux命令,接近POSIX标准。所以,在学习Node.js的时候,还是要学习linux的命令,两者在设计上有一定的关系。总结POSIX标准是操作系统能力的标准,定义了操作系统应该向应用程序公开哪些API,包括shell命令、c函数库、系统调用等标准。POSIX标准使应用程序能够在源代码级别跨平台移植,只需在不同平台上编译它们即可。POSIX是ISO认可的国际标准。最早由美国标准协会IEEE提出。ISO是专门制定国际标准的组织,成员来自多个国家。Node.js的API并没有做很多抽象,名字上大多与POSIX标准的API相似。这是它的特点。相比之下,JRE暴露给java的API做了很多抽象。因为Node.js的很多API都类似于C函数库和shell命令,学习Node.js结合学习shell命令,或者会C的能多学一些系统函数库,收获会更多。理解POSIX是理解Node.jsapi设计和学好Node.js的前提。
