Unix環境高級編程雖然是一本很經典的案頭必備的書籍,但它更像是一本字典,對于初學者來說看起來很艱難,《Unix/Linux編程實踐教程》中有趣的實例與循序漸進的講解,我認為更適合初學者的學習
【課程目錄】
第1章:unix系統編程概述
介紹
什么是系統編程
簡單的程序模型
系統模型
操作系統的職責
為程序提供服務
理解系統編程
系統資源
目標:理解系統編程
方法:通過三個問題來理解
從用戶的角度來理解unix
unix能做些什么
登錄–運行程序–注銷
目錄操作
文件操作
從系統的角度來看unix
用戶和程序之間的連接方式
網絡橋牌
bc:unix的計算器
從bc/dc到web
動手實踐
工作步驟與概要圖
接下來的工作步驟
unix的概要圖
unix的發展歷程
第2章:用戶、文件操作與聯機幫助:編寫who命令
介紹
關于命令who
問題1:who命令能做些什么
問題2:who命令是如何工作的
問題3:如何編寫who
問題:如何從文件中讀取數據結構
答案:使用open、read和close
編寫wh01.c
顯示登錄信息
編寫wh02.c
回顧與展望
編寫cp(讀和寫)
問題1:cp命令能做些什么
問題2:cp命令是如何創建/重寫文件的
問題3:如何編寫cp
unix編程看起來好像很簡單
提高文件i/o效率的方法:使用緩沖
緩沖區的大小對性能的影響
為什么系統調用需要很多時間
低效率的wh02.c
在wh02.c中運用緩沖技術
內核緩沖技術
文件讀寫
注銷過程:做了些什么
注銷過程:如何工作的
改變文件的當前位置
編寫終端注銷的代碼
處理系統調用中的錯誤
第3章:目錄與文件屬性:編寫ls
介紹
問題1:1s命令能做什么
1s可以列出文件名和文件的屬性
列出指定目錄或文件的信息
經常用到的命令行選項
問題1的答案
文件樹
問題2:1s是如何工作的
什么是目錄
是否可以用open、read和close來操作目錄
如何讀目錄的內容
問題3:如何編寫ls
編寫ls-1
問題1:ls-1能做些什么
問題2:ls-1是如何工作的
用stat得到文件信息
stat提供的其他信息
如何實現
將模式字段轉換成字符
將用戶/組id轉換成字符串
編寫ls2.c
三個特殊的位
set-user-id位
set-group-id位
sticky位
用ls-1看到的特殊屬性
ls小結
設置和修改文件的屬性
文件類型
許可位與特殊屬性位
文件的鏈接數
文件所有者與組
文件大小
時間
文件名
第4章:文件系統:編寫pwd
介紹
從用戶的角度看文件系統
目錄和文件
目錄命令
文件操作命令
針對目錄樹的命令
目錄樹的深度幾乎沒有限制
unix文件系統小結
unix文件系統的內部結構
第一層抽象:從磁盤到分區
第二層抽象:從磁盤到塊序列
第三層抽象:從塊序列到三個區域的劃分
文件系統的實現:創建一個文件的過程
文件系統的實現:目錄的工作過程
文件系統的實現:cat命令的工作原理
i-節點和大文件
unix文件系統的改進
理解目錄
理解目錄結構
與目錄樹相關的命令和系統調用
編寫pwd
pwd的工作過程
pwd的一種版本
多個文件系統的組合:由多棵樹構成的樹
裝載點
多重i-節點號和設備交叉鏈接
符號鏈接
第5章:連接控制:學習stty
為設備編程
設備就像文件
設備具有文件名
設備和系統調用
例子:終端就像文件
設備文件的屬性
編寫write程序
設備文件和i-節點
設備與文件的不同之處
磁盤連接的屬性
屬性1:緩沖
屬性2:自動添加模式
用open控制文件描述符
磁盤連接小結
終端連接的屬性
終端的i/o并不如此簡單
終端驅動程序
stty命令
編寫終端驅動程序:關于設置
編寫終端驅動程序:關tx數
編寫終端驅動程序:關于位
編寫終端驅動程序:幾個程序例子
終端連接小結
其他設備編程:ioctl
文件、設備和流
第6章:為用戶編程:終端控制和信號
軟件工具與針對特定設備編寫的程序
終端驅動程序的模式
規范模式:緩沖和編輯
非規范處理
終端模式小結
編寫一個用戶程序:play_again.c
信號
ctrl-c做什么
信號是什么
進程該如何處理信號
信號處理的例子
為處理信號做準備:play_again4.c
進程終止
為設備編程
第7章:事件驅動編程:編寫一個視頻游戲
視頻游戲和操作系統
任務:單人彈球游戲(pong)
屏幕編程:curses庫
介紹curses
curses內部:虛擬和實際屏幕
時間編程:sleep
時鐘編程1:alarms
添加時延:sleep
sleep()是如何工作的:使用unix中的alarms
調度將要發生的動作
時間編程2:間隔計時器
添加精度更高的時延:usleep
三種計時器:真實、進程和實用
兩種間隔:初始和重復
用間隔計時器編程
計算機有幾個時鐘
計時器小結
信號處理1:使用signal
早期的信號處理機制
處理多個信號
測試多個信號
信號機制其他的弱點
信號處理2:sigaction
處理多個信號:sigaction
信號小結
防止數據損毀(datacorruption)
數據損毀的例子
臨界(criticalsections)
阻塞信號:sigprocmask和sigsetops
重入代碼(reentrantcode):遞歸調用的危險
視頻游戲中的臨界區
kill:從另–個進程發送的信號
使用計時器和信號:視頻游戲
bounceld.c:在一條線上控制動畫
bounce2d.c:兩維動畫
完成游戲
輸入信號,異步i/o
使用異步i/o
方法1:使用oasync
方法2:使用aio..read
彈球程序中需要異步讀人嗎
異步輸入、視頻游戲和操作系統
第8章:進程和程序:編寫命令解釋器sh
進程=運行中的程序
通過命令ps學習進程
系統進程
進程管理和文件管理
內存和程序
shell:進程控制和程序控制的–個工具
shell是如何運行程序的
shell的主循環
問題1:一個程序如何運行另一個程序
問題2:女口何建立新的進程
問題3:父進程如何等待子進程的退出
小結:shell如何運行程序
實現一個shell:psh2.c
思考:用進程編程
exit和exec的其他細節
進程死亡:exit和_exit
exec家族??
第9章:可編程的shell、shell變量和環境:編寫自己的shell
shell編程
什么是以及為什么要使用shell腳本語言
smshl–命令行解析
shell中的流程控制
if語句做些什么
if是女口何工作的
在stash中增加if
smsh2.c:修改后的代碼
shell變量:局部和全局
使用shell變量
變量的存儲
增加變量命令:built-ins
效果如何
環境:個性化設置
使用環境
什么是環境以及它是如何工作的
在smsh中增加環境處理
varlib.c的代碼
已實現的shell的功能
第10章:i/o重定向和管道
shell編程
一個shell應用程序:監視系統用戶
標準i/o與重定向的若干概念
概念1:3個標準文件描述符
默認的連接:tty
程序都輸出到stdout
重定向i/o的是shell而不是程序
理解i/o重定向
概念2:“最低可用文件描述符(lowest-available-fd)”原則
兩個概念的結合
如何將stdin定向到文件
方法1:closethenopen
方法2:open..close..dup..close
系統調用dup小結
方法3:open..dup2..close
shell為其他程序重定向stdin
為其他程序重定向i/o:who]userlist
管道編程
創建管道
使用fork來共享管道
使用pipe、fork以及exec
技術細節:管道并非文件
第11章:連接到近端或遠端的進程:服務器與socket(套接宇)
產品和服務
一個簡單的比喻:飲料機接口
bc:unix中使用的計算器
編寫bc:pipe、fork、dup、exec
對協同進程的討論
fdopen:讓文件描述符像文件–樣使用
popen-讓進程看似文件
popen的功能
實現popen:使用fdopen命令
訪問數據:文件、應用程序接el(apl)和服務器
socket:與遠端進程相連
類比:“電話中傳來聲音:現在時間是…”
因特網時間、dap和天氣服務器
服務列表:眾所周知的端口
編寫timeserv? ?? ???.? ?? ???cc時間服務器
測試timeserv.c
編寫timecint.c:時間服務客戶端
測試timecint.c
另一種服務器:遠程的ls
軟件精靈
第12章:連接和協議:編寫web服務器
服務器設計重點
三個主要操作
操作1和操作2:建立連接
操作1:建立服務器端socket
操作2:建立到服務器的連接
socklib.c
操作3:客戶/服器的會話
使用socklib.c的timeserv/timecint
第2版的服務器:使用fork
服務器的設計問題:diy或代理
編寫web服務器
web服務器功能
設計web服務器
web服務器協議
編寫web服務器
運行web服務器
webserv的源程序
比較web服務器
第13章:基于數據報(datagram)的編程:編寫許可證服務器
軟件控制
許可證控制簡史
一個非計算機系統實例:轎車管理系統
轎車鑰匙管理描述
用客戶/服務器方式管理轎車
許可證管理
許可證服務系統:它做些什么
許可證服務系統:如何工作
一個通信系統的例子
數據報socket
流與數據報的比較
數據報編程
sendto和recvfrom的小結
數據報應答
數據報小結
許可證服務器版本1.0
客戶端版本1
服務器端版本1
測試版本1
進一步的工作
處理現實的問題
處理客戶端崩潰
處理服務器崩潰
測試版本2
分布式許可證服務器
unix域socket
文件名作為socket地址
使用unix域socket編程
小結;socket和服務器
第14章:線程機制:并發函數的使用
同一時刻完成多項任務
函數的執行路線
一個單線程程序
一個多線程程序
相關函數小結
線程間的分工合作
例1:incrprint.c
例2:twordcount.c
線程內部的分工合作:小結
線程與進程
線程間互通消息
通知選舉中心
使用條件變量編寫程序
使用條件變量的函數
回到web服務器的例子
多線程的web服務器
web服務器程序的改進
多線程版本允許一個新的功能
防止僵尸線程(zombiethreads):獨立線程
web服務器代碼
線程和動畫
使用線程的優點
多線程版本的bouneeld.c
基于多線程機制的多重動畫:tanimate.c
tanimate.c中的互斥量
屏幕控制線程??
第15章:進程間通信(1pc)
編程方式的選擇
talk命令:從多個數據源讀取數據
同時從兩個文件描述符讀取數據
select系統調用
select與talk
select與poll
通信的選擇
一個問題的三種解決方案
通過文件的進程間通信
命名管道
共享內存
各種進程間通信方法的比較
進程之間的分工合作
文件鎖
信號量(semaphores)
socket及fifo與共享的存儲
打印池
多個寫者、一個讀者
客戶/服務器模型
縱觀ipc
連接與游戲