「理解Unix程式」讀書筆記

daydaygo發表於2017-10-13

date: 2017-10-13 16:17:28 title: 「理解Unix程式」讀書筆記

百度腦圖 - 理解UNIX程式: http://naotu.baidu.com/file/8945ac178c9961cda97a17a44de511ad?token=1447b9bed19693b2

圖靈社群 - 理解UNIX程式: http://www.ituring.com.cn/book/1081

知道如何使用計算機,但對於計算機的工作原理卻一無所知; 對工作原理有了深入的瞭解之後,可以更快地 理解並診斷出現的問題

能力越大,責任也越大

使用者空間(userland)和核心

系統呼叫

manpages

所有的程式碼都是在程式中執行的

程式皆有標識 pid

常常會在日誌檔案中發現pid

程式皆有父 ppid

程式皆有檔案描述符

檔案描述符代表開啟的檔案

Unix哲學:在Unix世界中,萬物皆為檔案

檔案描述符只是用來跟蹤開啟的資源

每個Unix程式都有三個開啟的資源,它們是標準輸入(STDIN)、標準輸出(STDOUT)和標準錯誤(STDERR)

程式皆有資源限制

核心為程式施加了某些資源限制

軟限制與硬限制

sysctl(8)

程式皆有環境

環境變數

系統呼叫不能直接操作環境變數

程式皆有引數

argv是argument vector

ENV並不是Hash

ARGV只是一個Array

程式皆有名

兩種運作在程式自身層面上的機制可以用來互通訊息。一個是程式名稱,另一個是退出碼。

程式皆有退出碼

另一種結束程式的方法是使用一個未處理的異常

程式皆可衍生

程式從父程式處繼承了其所佔用記憶體中的所有內容,以及所有屬於父程式的已開啟的檔案描述符

竟然同時執行了if語句的if和else程式碼塊

其實也可以通過block來使用fork

守護程式

與脫離終端會話的程式進行通訊

Unix訊號

寫時複製(copy-on-write,CoW)

程式可待

即發即棄(fire and forget)

看顧(Babysitting)

競爭條件(race conditions)

master/worker

殭屍程式

Good Things Come to Those Who Wait。

程式皆可獲得訊號

訊號投遞是不可靠的

任何一行程式碼都能夠被訊號中斷

訊號是一種非同步通訊

(1) 忽略該訊號 (2) 執行特定的操作 (3) 執行預設的操作

訊號由核心傳送

重定義訊號

忽略訊號

捕獲一個訊號有點像使用一個全域性變數

如果程式在接收到一個訊號的同時還在處理其他的訊號

程式皆可互通

程式間通訊(簡稱IPC)

管道和套接字對(socket pairs)。

共享管道

有自己的檔案描述符以及其他的一切,因此也可以與子程式共享。

流與訊息: 沒有開始和結束的概念。

之後跟著一些特定協議的分隔符(delimiter)

遠端IPC: TCP RPC 分散式系統

管道和套接字都是對程式間通訊的有益抽象。

守護程式是在後臺執行的程式,不受終端使用者控制

首個程式

程式組和會話組

會話組是更高一級的抽象,它是程式組的集合

/dev/null

生成終端程式

除非你真的需要,通常我們都會避免傳遞字串,而是儘可能地傳遞陣列。

與Unix程式打交道事關兩件事:抽象和通訊。

相關文章