請AI教我Linux系列 I
什麼是系統程式設計?
簡單來說,系統程式設計就是在學習怎麼跟作業系統的「核心」直接打交道 。它教你怎麼「發號施令」給系統,讓你的應用程式可以更有效地利用電腦資源,像是記憶體、CPU 時間和檔案等等 。
檔案系統與檔案操作
在 Linux 和 UNIX 系統裡,有個很特別、也很重要的概念:「一切皆檔案」 。所有的東西,從你的文字檔到硬體裝置,甚至是程序間的通訊管道,都可以用類似檔案的方式來處理。整個系統的檔案都組織在一個單一的目錄樹狀結構下 。
我們可以用 open()
這個「系統呼叫」來開啟或建立一個檔案 。成功的話,它會給你一個「檔案描述符」,就像是這個檔案的專屬代號一樣 。之後,你就可以用 read()
和 write()
來讀寫資料了 。當你用完檔案,記得要用 close()
把它的「檔案描述符」關掉 。如果你想在檔案裡跳到特定的位置讀寫,lseek()
就能幫上忙 。還有個很有用的功能叫做「非阻塞 I/O」,它讓程式在資料還沒準備好時,不會傻傻地等,而是可以先做別的事 。
檔案的「身份證」和「超能力」
每個檔案在系統裡都有一個獨特的「身份證」,叫做 i-node。這個 i-node 裡面存了很多關於檔案的「元資料」,也就是檔案的檔案,像是誰是擁有者、檔案權限、檔案大小、有多少「硬連結」指向它等等。要查看這些詳細的「身份證」資訊,可以用 stat()
這個系統呼叫。
除了基本的資訊,檔案還可以有一些額外的「超能力」,這些就是「擴展屬性」(Extended Attributes, EA)。它讓你可以在檔案的 i-node 上附加更多的自訂資訊,這些資訊會以「名稱-值」配對的形式存在。
檔案存取控制
既然有檔案,那麼誰可以碰它、怎麼碰,就非常重要了 。這就是「存取控制列表」(Access Control Lists, ACL) 的工作。ACL 可以設定很細緻的權限,不只是傳統的「擁有者、群組、其他人」這三種權限,還可以針對特定的使用者或群組給予不同的讀、寫、執行權限。
目錄與連結
檔案系統裡不只有一般的資料檔案,還有用來組織檔案的「目錄」。你可以把目錄想像成一個清單,裡面列出了檔案名稱和它們對應的 i-node 號碼 。
「連結」也是個很有趣的概念。你可以為同一個檔案建立多個「硬連結」,就像是給同一個檔案取了不同的名字,它們都指向同一個 i-node 。另外,還有「符號連結」(或稱軟連結),它是一個特殊檔案,裡面儲存著另一個檔案的路徑名稱,就像是Windows裡的捷徑 。
我們可以透過 mkdir()
建立新目錄,用 rmdir()
刪除目錄。如果要讀取目錄裡有什麼檔案或子目錄,可以用 opendir()
和 readdir()
。
程序與記憶體
當你執行一個程式時,它就變成了一個正在運行的「程序」(Process) 。每個程序都有個獨特的「程序 ID」(PID),就像是它的身分證字號 。
程序的記憶體空間並不是雜亂無章的,它會被邏輯上分成好幾塊,我們叫做「區段」。像是存放程式指令的「文字區段」、存放初始化資料的「資料區段」、還有可以動態增減的「堆疊」(Stack) 和「堆積」(Heap) 。其中,malloc()
和 free()
這些函式就是用來在「堆積」上動態地分配和釋放記憶體的。
還有一些特殊的程序叫做「守護程序」(Daemon),它們通常在系統啟動時就開始運行,並在背景默默執行,沒有連接到任何終端機。
時間、信號與排程
作業系統會精確地追蹤時間。我們有我們日常看到的「真實時間」,也有程序實際佔用 CPU 執行的「程序時間」。
「信號」(Signals) 就像是作業系統發出的通知或警報,用來告訴程序發生了什麼事件 。程序可以選擇怎麼回應這些信號,比如忽略它,讓它終止程序,或者執行一個叫做「信號處理器」的特定函式 。
程序也有「優先權」。你可以透過調整一個叫做「nice 值」的設定,來影響核心排程器給程序分配 CPU 時間的比例 。一個「nice 值」越低的程序(例如負值),通常會被視為有較高的執行優先權。
*以上文章部份為AI產生內容,無商業用途。