自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

深入理解Node.js 的 API 設(shè)計(jì)的源頭:POSIX

開發(fā) 前端
POSIX 標(biāo)準(zhǔn)是操作系統(tǒng)能力的標(biāo)準(zhǔn),定義了操作系統(tǒng)應(yīng)該暴露什么 api 給應(yīng)用程序,包括 shell 命令、c 函數(shù)庫、系統(tǒng)調(diào)用等標(biāo)準(zhǔn)。

[[420926]]

如果你用過 Node.js 的 api,會不會覺得奇怪,為什么 api 的名字是這樣的:

比如創(chuàng)建目錄:

  1. const fs = require('fs'); 
  2.  
  3. fs.mkdir('/a/b/c', { recursive: true }, (err) => { 
  4.   if (err) throw err; 
  5. }); 

創(chuàng)建進(jìn)程:

  1. const childProcess = require('child_process'); 
  2.  
  3. childProcess.fork('a/b/c.js'); 
  4. childProcess.execFile('a/b/dddd'); 
  5. childProcess.exec('"/path/to/test file/test.sh" arg1 arg2'); 
  6. childProcess.spawn('ls', ['-lh''/usr']); 

mkdir、fork、exec、spawn 等,這些名字是怎么起的?

如果你用過 linux 命令或者 c 的函數(shù)庫,你會發(fā)現(xiàn)這些 api 在命令和 c 函數(shù)庫中也都是這個名字。

為什么會這樣呢?這些 api 是什么標(biāo)準(zhǔn)么?

沒錯,這就是 POSIX 標(biāo)準(zhǔn)

POSIX 是什么

POSIX 是 portable operating system interface (可移植的操作系統(tǒng)接口)的縮寫,x 是 unix 的意思,也就是從 unix 繼承而來。

因?yàn)椴煌僮飨到y(tǒng)如果提供的函數(shù)和系統(tǒng)調(diào)用不一樣,那么基于操作系統(tǒng)的上層應(yīng)用程序的源代碼就不一樣,這就導(dǎo)致了一個平臺寫的代碼沒法在另一個平臺上編譯。

怎么辦呢?

如果每個操作系統(tǒng)提供的 api 一樣呢?不管操作系統(tǒng)底層怎么實(shí)現(xiàn)這些能力的,只要暴露出同樣的 api 給應(yīng)用程序即可,這樣源代碼是跨平臺的,在不同的操作系統(tǒng)上編譯之后就能跑起來。

這個統(tǒng)一操作系統(tǒng)暴露的 api 的標(biāo)準(zhǔn)就是 POSIX。

可以把這個 POSIX 標(biāo)準(zhǔn)理解為 ts 里面定義的一個 interface,只要實(shí)現(xiàn)了這個 interface 的 api 就是兼容 POSIX 標(biāo)準(zhǔn)的。

POSIX 最早是 unix 擴(kuò)展而來,linux 實(shí)現(xiàn)了這個 POSIX 的標(biāo)準(zhǔn),而后來 windows 迫于壓力,也不得不兼容了 POSIX 標(biāo)準(zhǔn),不然很多 linux 的應(yīng)用程序在 windows 上就跑不起來。我們常用的 osx 也是。

所以說,POSIX 是操作系統(tǒng)向上層應(yīng)用提供能力的一些標(biāo)準(zhǔn)接口,包括系統(tǒng)調(diào)用、c 函數(shù)庫、shell 命令。

  • 所謂的標(biāo)準(zhǔn)是指被 ISO 國際標(biāo)準(zhǔn)化組織承認(rèn)的,這是一個國際組織,成員遍布各個國家,是制定各種國際標(biāo)準(zhǔn)的組織。POSIX 就是 ISO/IEC 9945 標(biāo)準(zhǔn)(IEC 是電子方向的標(biāo)準(zhǔn)化組織)。其實(shí) POSIX 是 IEEE 提出來的,這是一個美國的標(biāo)準(zhǔn)化組織,他提出的標(biāo)準(zhǔn)被 ISO 承認(rèn)會成為國際標(biāo)準(zhǔn),比如 POSIX 就是他們提出的 IEEE Std 1003 標(biāo)準(zhǔn),現(xiàn)在被 ISO 承認(rèn),成為了 ISO/IEC 9945 標(biāo)準(zhǔn)。

POSIX 有哪些內(nèi)容

我們來看一下支持 posix 的 linux 提供了哪些系統(tǒng)調(diào)用(系統(tǒng)調(diào)用指的是在內(nèi)核代碼中提供的程序):

進(jìn)程控制:

  • fork 創(chuàng)建一個新進(jìn)程
  • execv 運(yùn)行可執(zhí)行文件
  • exit 中止進(jìn)程

文件讀寫

  • open 打開文件
  • close 關(guān)閉文件描述符
  • write 寫文件
  • read 讀文件
  • truncate 截?cái)辔募?/li>
  • fsync 把文件在內(nèi)存的部分寫入磁盤

文件系統(tǒng)相關(guān)

  • access 確定文件是否可存取
  • chdir 改變當(dāng)前工作目錄
  • chown 改變文件的屬主或者用戶組
  • stat 取文件狀態(tài)信息
  • mkdir 創(chuàng)建目錄
  • symlink 創(chuàng)建符號鏈接
  • unlink 刪除鏈接

這些系統(tǒng)調(diào)用很多在 Node.js 里有同名的 api,shell 也有同名的命令:

比如:

  1. fs.stats 
  2. fs.access 
  3. fs.chown 
  4. fs.mkdir 
  5.  
  6. fs.open 
  7. fs.close 
  8. fs.read 
  9. fs.write 
  10.  
  11. child_process.fork 
  12. child_process.exec 
  13. child_process.execFile 

Node.js api 的特點(diǎn)

Node.js 是一個 js 的運(yùn)行時(shí),基于 v8 來注入很多提供操作系統(tǒng)能力的 api 給 js 調(diào)用,而這些 api 的設(shè)計(jì)很多都是直接用的 POSIX 標(biāo)準(zhǔn)的 api 名字,沒有做很多抽象。

Java 的 JRE(java runtime) 也提供了操作系統(tǒng)能力的抽象,但是那些 api 卻和操作系統(tǒng) POSIX 的 api 關(guān)系不大,而且融入了很多設(shè)計(jì)模式的東西,比如 io 流的裝飾器模式。

Node.js 的 api 的特點(diǎn)就是抽象并不多,而且很多 api 名字和 linux 命令都很像,貼近 POSIX 標(biāo)準(zhǔn)。所以學(xué)習(xí) Node.js 的時(shí)候還是要學(xué)習(xí)下 linux 命令的,這兩者在設(shè)計(jì)上有一定的關(guān)系。

總結(jié)

POSIX 標(biāo)準(zhǔn)是操作系統(tǒng)能力的標(biāo)準(zhǔn),定義了操作系統(tǒng)應(yīng)該暴露什么 api 給應(yīng)用程序,包括 shell 命令、c 函數(shù)庫、系統(tǒng)調(diào)用等標(biāo)準(zhǔn)。POSIX 標(biāo)準(zhǔn)使得應(yīng)用程序在源碼層面是可以跨平臺移植的,分別在不同平臺做編譯即可。

POSIX 是 ISO 承認(rèn)的國際化標(biāo)準(zhǔn),最早是由美國的一個標(biāo)準(zhǔn)協(xié)會 IEEE 提出的。ISO 是專門定制國際標(biāo)準(zhǔn)的組織,有很多國家的成員參與。

Node.js 的 api 并沒有做很多抽象,名字也很大部分和 POSIX 標(biāo)準(zhǔn)的 api 比較像,這是它的特點(diǎn),相比之下,JRE 暴露給 java 的 api 則做了很多抽象。

因?yàn)?Node.js 的 api 很多和 c 函數(shù)庫、shell 命令比較接近,所以學(xué)習(xí) Node.js 結(jié)合學(xué)習(xí) shell 命令,或者會 c 的可以再學(xué)下系統(tǒng)的函數(shù)庫會有更多的收獲。

了解 POSIX,是理解 Node.js api 設(shè)計(jì),學(xué)好 Node.js 的前提。

 

責(zé)任編輯:姜華 來源: 神光的編程秘籍
相關(guān)推薦

2021-10-16 05:00:32

.js Buffer模塊

2021-08-05 05:46:06

Node.jsInspector工具

2021-08-12 01:00:29

NodejsAsync

2021-08-26 13:57:56

Node.jsEncodingBuffer

2021-09-10 06:50:03

Node.jsSocket端口

2013-11-01 09:34:56

Node.js技術(shù)

2019-08-15 14:42:24

進(jìn)程線程javascript

2021-05-27 09:00:00

Node.js開發(fā)線程

2024-01-05 08:49:15

Node.js異步編程

2022-09-04 15:54:10

Node.jsAPI技巧

2022-02-21 16:57:13

APIIDE構(gòu)建系統(tǒng)

2013-06-14 09:27:51

Express.jsJavaScript

2011-12-23 13:58:57

node.js

2015-07-16 09:59:55

PHP Node.js討論

2024-09-25 08:04:58

2022-03-08 15:13:34

Fetch APINode.js開發(fā)者

2023-01-10 14:11:26

2020-08-31 15:00:17

Node.jsrequire前端

2020-05-29 15:33:28

Node.js框架JavaScript

2012-11-22 10:11:16

LispLisp教程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號