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