linux環(huán)境編程系統(tǒng)培訓(xùn)_第1頁
linux環(huán)境編程系統(tǒng)培訓(xùn)_第2頁
linux環(huán)境編程系統(tǒng)培訓(xùn)_第3頁
linux環(huán)境編程系統(tǒng)培訓(xùn)_第4頁
linux環(huán)境編程系統(tǒng)培訓(xùn)_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

LINUX環(huán)境編程系統(tǒng)培訓(xùn)2009-10-10目錄文件編程多進(jìn)程編程和進(jìn)程控制多線程編程網(wǎng)絡(luò)基本概念網(wǎng)絡(luò)編程嵌入式數(shù)據(jù)庫編程其它技巧及常用軟件系統(tǒng)架構(gòu)文件IO與標(biāo)準(zhǔn)IO的區(qū)別文件共享原子操作文件記錄鎖IO的效率進(jìn)程打開的文件描述字個(gè)數(shù)幾個(gè)常用的函數(shù)文件和目錄操作大多數(shù)U

N

I

X文件I/O只需用到5個(gè)函數(shù):o

p

e

n、r

e

a

d、w

r

i

t

e、lseek以及close。然后說明不同緩存器長度對(duì)rea

d和write函數(shù)的影響。上面這些函數(shù)經(jīng)常被稱之為不帶緩存的I/O(unbufferedI/O,不帶緩存----指的是每個(gè)r

e

a

d和w

r

i

t

e都調(diào)用內(nèi)核中的一個(gè)系統(tǒng)調(diào)用。這些不帶緩存的I/O函數(shù)不是ANSI

C的組成部分,但是是P

O

S

I

X.1和X

P

G

3的組成部分。標(biāo)準(zhǔn)I/O提供緩存,目其的是盡可能減少使用r

e

a

d和w

r

i

t

e調(diào)用的數(shù)量,它也對(duì)每個(gè)I/O流自動(dòng)地進(jìn)行緩存管理,避免了應(yīng)用程序需要考慮這一點(diǎn)所帶來的麻煩。不幸的是,標(biāo)準(zhǔn)I/O庫令人最感迷惑的也是它的緩存。標(biāo)準(zhǔn)I/O有三種緩存類型:全緩存,行緩存,不緩存。我們可以通過buffersize.c程序來測(cè)試緩存的大小。我們可以通過iofork.c程序來測(cè)試緩存給我們帶來的困擾我們可以通過bufferio.c和fileio.c程序來測(cè)試文件I/O和標(biāo)準(zhǔn)I/O的區(qū)別文件I/O與標(biāo)準(zhǔn)I/O的區(qū)別在例fileshare.c中,我們?cè)趦蓚€(gè)進(jìn)程中對(duì)同一個(gè)文件寫入,會(huì)發(fā)現(xiàn)后一次的寫入會(huì)覆蓋前一次的寫入,我們可以作這樣的改進(jìn):在每次寫入之前我們先定位到文件結(jié)尾,再寫入:if

(lseek(fd,

0L,

SEEK_END)

<

0)

/*position

to

EOF*/printf("lseek

error:%s\n“,

strerror(errno));if

(write(fd,

buff,

100)

!=

100)

/*and

write*/printf(“write

error:%s\n“,

strerror(errno));這樣看起來似乎沒有問題,但是實(shí)際操作的時(shí)候卻有可能在執(zhí)行第一句時(shí)被中斷,然后由另一進(jìn)程執(zhí)行,再切換回來的時(shí)候仍然會(huì)覆蓋另一進(jìn)程寫入的結(jié)果。文件共享上面的問題出在邏輯操作“定位檔到文件尾端處,然后寫”使用了兩個(gè)分開的函數(shù)調(diào)用。解決問題的方法是使這兩個(gè)操作對(duì)于其他進(jìn)程而言成為一個(gè)原子操作。任何一個(gè)要求多于1個(gè)函數(shù)調(diào)用的操作都不能成為原子操作,因?yàn)樵趦蓚€(gè)函數(shù)調(diào)用之間,內(nèi)核有可能會(huì)臨時(shí)掛起該進(jìn)程。LI

N

U

X

提供了一種方法使這種操作成為原子操作,其方法就是在打開文件時(shí)設(shè)置O_APPEND標(biāo)志。另外,我們?cè)趧?chuàng)建文件的時(shí)候,如果先判斷某個(gè)文件是否存在,若不存在,則創(chuàng)建它,如果在打開和創(chuàng)建之間,另一個(gè)進(jìn)程創(chuàng)建了該文件,那么就會(huì)發(fā)生問題。如果在這兩個(gè)函數(shù)調(diào)用之間,另一個(gè)進(jìn)程創(chuàng)建了該文件,而且又向該文件寫進(jìn)了一些數(shù)據(jù),那么執(zhí)行這段程序中的creat時(shí),剛寫上去的數(shù)據(jù)就會(huì)被擦去,前面講的open時(shí)使用O_EXCL便可解決這個(gè)問題。一般而言,原子操作(atomic

operation)指的是由多步組成的操作。如果該操作原子地執(zhí)行,則或者執(zhí)行完所有步,或者一步也不執(zhí)行,不可能只執(zhí)行所有步的一個(gè)子集。文件I/O中的原子操作當(dāng)兩個(gè)人同時(shí)編輯一個(gè)文件時(shí),其后果將如何呢?在很多U

NIX系統(tǒng)中,該文件的最后狀態(tài)取決于寫該文件的最后一個(gè)進(jìn)程。但是對(duì)于有些應(yīng)用程序,例如數(shù)據(jù)庫,有時(shí)進(jìn)程需要確保它正在單獨(dú)寫一個(gè)文件。我們引進(jìn)記錄鎖的概念。記錄鎖(record

locking)的功能是:一個(gè)進(jìn)程正在讀或修改文件的某個(gè)部分時(shí),可以阻止其他進(jìn)程修改同一文件區(qū)。文件記錄鎖操作通過fcntl函數(shù)實(shí)現(xiàn),當(dāng)fcntl的cmd是F_GETLK、F_SETLK或F_SETLKW。第三個(gè)參數(shù)是一個(gè)指向flock結(jié)構(gòu)的指針。例子見lockfile.c文件記錄鎖文件區(qū)加鎖狀態(tài)是否能加讀鎖是否能加寫鎖無鎖是是讀鎖是否寫鎖否否在有些情況下,我們從文件中讀寫數(shù)據(jù)時(shí)并不只能簡單的實(shí)現(xiàn)訪問文件的功能,而要考慮訪問的速度,如視頻存儲(chǔ)錄像,文件上傳服務(wù)。文件訪問的速度與I/O的緩沖大小有關(guān)系,與訪問的次數(shù)也有關(guān)系,也當(dāng)然與存儲(chǔ)的媒體介質(zhì)類型有關(guān)系,如USB接口的移動(dòng)硬盤與IDE接口的硬盤讀寫速度便不一樣。我們可以通過代碼進(jìn)行測(cè)試在多大緩沖時(shí)寫入的速度最快。I/O的效率access:access函數(shù)實(shí)現(xiàn)按實(shí)際用戶ID和實(shí)際組ID進(jìn)行存取許可權(quán)測(cè)試的功能。stat:stat函數(shù)返回一個(gè)與此命名文件有關(guān)的信息結(jié)構(gòu),fstat函數(shù)獲得已在描述符filedes上打開的文件的有關(guān)信息。lstat函數(shù)類似于stat,但是當(dāng)命名的文件是一個(gè)符號(hào)連接時(shí),lstat返回該符號(hào)連接的有關(guān)信息,而不是由該符號(hào)連接引用的文件的信息。opendir:打開一個(gè)目錄進(jìn)行訪問

readdir:讀目錄link:創(chuàng)建一個(gè)文件的硬鏈接unlink:刪除一個(gè)文件另幾個(gè)常用的函數(shù)vfork與fork的區(qū)別exec與system的區(qū)別wait與waitpid信號(hào)處理進(jìn)程間通訊進(jìn)程運(yùn)行狀態(tài)多進(jìn)程編程vfork用于創(chuàng)建一個(gè)新進(jìn)程,而該新進(jìn)程的目的是

exec一個(gè)新程序。程序。vfork與fork一樣都創(chuàng)建一個(gè)子進(jìn)程,但是它并不將父進(jìn)程的地址空間完全復(fù)制到子進(jìn)程中,因?yàn)樽舆M(jìn)程會(huì)立即調(diào)用exec(或exit),于是也就不會(huì)存訪該地址空間。不過在子進(jìn)程調(diào)用exec或exit之前,它在父進(jìn)程的空間中運(yùn)行。這種工作方式在某些UNIX的頁式虛存實(shí)現(xiàn)中提高了效率。vfork和fork之間的另一個(gè)區(qū)別是:vfork保證子進(jìn)程先運(yùn)行,在它調(diào)用exec或exit之后父進(jìn)程才可能被調(diào)度運(yùn)行。(如果在調(diào)用這兩個(gè)函數(shù)之前子進(jìn)程依賴于父進(jìn)程的進(jìn)一步動(dòng)作,則會(huì)導(dǎo)致死鎖。)vfork與fork的區(qū)別system在其實(shí)現(xiàn)中調(diào)用了fork、exec和waitpid,因此有三種返回值:如果f

o

r

k失敗或者w

a

i

t

p

i

d返回除E

I

N

T

R之外的出錯(cuò),則

system返回-1,而且e

r

r

n

o中設(shè)置了錯(cuò)誤類型。如果exec失敗(表示不能執(zhí)行shell),則其返回值如同shell執(zhí)行了exit(127)一樣。否則所有三個(gè)函數(shù)(fork,exec和waitpid)都成功,并且system的返回值是shell的終止?fàn)顟B(tài)。exec當(dāng)進(jìn)程調(diào)用一種exec函數(shù)時(shí),該進(jìn)程完全由新程序代換,而新程序則從其main函數(shù)開始執(zhí)行。因?yàn)檎{(diào)用exec并不創(chuàng)建新進(jìn)程,所以前后的進(jìn)程ID并未改變。exec只是用另一個(gè)新程序替換了當(dāng)前進(jìn)程的正文、數(shù)據(jù)、堆和棧段。exec與system的區(qū)別當(dāng)一個(gè)進(jìn)程正?;虍惓=K止時(shí),內(nèi)核就向其父進(jìn)程發(fā)送SI

G

C

H

L

D信號(hào)。因?yàn)樽舆M(jìn)程終止是個(gè)異步事件(這可以在父進(jìn)程運(yùn)行的任何時(shí)候發(fā)生),所以這種信號(hào)也是內(nèi)核向父進(jìn)程發(fā)的異步通知。父進(jìn)程可以忽略該信號(hào),或者提供一個(gè)該信號(hào)發(fā)生時(shí)即被調(diào)用執(zhí)行的函數(shù)(信號(hào)處理程序)。對(duì)于這種信號(hào)的系統(tǒng)默認(rèn)動(dòng)作是忽略它??梢酝ㄟ^wait和waitpid來實(shí)現(xiàn)守護(hù)進(jìn)程,見daemon.cwait與waitpid我們的程序在運(yùn)行中,經(jīng)常可能會(huì)接收到各種信號(hào),在遇到信號(hào)時(shí),我們通常要么是忽略這個(gè)信號(hào),要么是通過信號(hào)處理函數(shù)對(duì)此信號(hào)進(jìn)行處理,如我們常忽略的信號(hào):SIGPIPE,SIGCHLD,SIGHUP,我們常常也會(huì)對(duì)SIGTERM,SIGKILL及SIGINT等信號(hào)進(jìn)行處理。信號(hào)也常被用在進(jìn)程間通訊,如常用的兩個(gè)信號(hào):SIGUSR1和SIGUSR2信號(hào)處理進(jìn)程間為什么需要通訊?進(jìn)程間通訊的幾種方式:內(nèi)存共享管道信號(hào)SOCKET進(jìn)程間通訊用戶狀態(tài):進(jìn)程在用戶狀態(tài)下運(yùn)行的狀態(tài)。內(nèi)核狀態(tài):進(jìn)程在內(nèi)核狀態(tài)下運(yùn)行的狀態(tài)。內(nèi)存中就緒:進(jìn)程沒有執(zhí)行,但處于就緒狀態(tài),只要內(nèi)核調(diào)度它,就可以執(zhí)行。內(nèi)存中睡眠:進(jìn)程正在睡眠并且進(jìn)程存儲(chǔ)在內(nèi)存中,沒有被交換到SWAP設(shè)備。

就緒且換出:進(jìn)程處于就緒狀態(tài),但是必須把它換入內(nèi)存,內(nèi)核才能再次調(diào)度它運(yùn)行。睡眠且換出:進(jìn)程正在睡眠,且被換出內(nèi)存。被搶先:進(jìn)程從內(nèi)核狀態(tài)返回用戶狀態(tài)時(shí),內(nèi)核搶先于它做了上下文切換,調(diào)度了另一個(gè)進(jìn)程。原先這個(gè)進(jìn)程就處于被搶先狀態(tài)。創(chuàng)建狀態(tài):進(jìn)程剛被創(chuàng)建。該進(jìn)程存在,但既不是就緒狀態(tài),也不是睡眠狀態(tài)。這個(gè)狀態(tài)是除了進(jìn)程0以外的所有進(jìn)程的最初狀態(tài)。僵死狀態(tài)(zombie):進(jìn)程調(diào)用exit結(jié)束,進(jìn)程不再存在,但在進(jìn)程表項(xiàng)中仍有記錄,該記錄可由父進(jìn)程收集。現(xiàn)在我們從進(jìn)程的創(chuàng)建到退出來看看進(jìn)程的狀態(tài)轉(zhuǎn)化。需要說明的是,進(jìn)程在它的生命周期里并不一定要經(jīng)歷所有的狀態(tài)。進(jìn)程狀態(tài)可通過ps指令進(jìn)行查看外,也可以通過寫程序訪問/proc目錄下對(duì)應(yīng)的進(jìn)程ID目錄下的狀態(tài)文件檢查進(jìn)程運(yùn)行狀態(tài)進(jìn)程運(yùn)行狀態(tài)線程與進(jìn)程的區(qū)別互斥鎖線程參數(shù)線程池進(jìn)程打開的文件描述字個(gè)數(shù)線程安全函數(shù)多線程編程DNSDHCPPPPOEB/S與C/S架構(gòu)常用網(wǎng)絡(luò)傳輸協(xié)議RPC、SOAP負(fù)載均衡熱備網(wǎng)絡(luò)基本概念DNS是域名系統(tǒng)(Domain

Name

System)的縮寫,該系統(tǒng)用于命名組織到域?qū)哟谓Y(jié)構(gòu)中的計(jì)算機(jī)和網(wǎng)絡(luò)服務(wù)。在Internet上域名與IP地址之間是一對(duì)一(或者一對(duì)多)的,域名雖然便于人們記憶,但機(jī)器之間只能互相認(rèn)識(shí)IP地址,它們之間的轉(zhuǎn)換工作稱為域名解析,域名解析需要由專門的域名解析服務(wù)器來完成,DNS就是進(jìn)行域名解析的服務(wù)器。DNS命名用于Internet等TCP/IP網(wǎng)絡(luò)中,通過用戶友好的名稱查找計(jì)算機(jī)和服務(wù)。當(dāng)用戶在應(yīng)用程序中輸入DNS名稱時(shí),DNS服務(wù)可以將此名稱解析為與之相關(guān)的其他信息,如IP地址。因?yàn)?,你在上網(wǎng)時(shí)輸入的網(wǎng)址,是通過域名解析系統(tǒng)解析找到了相對(duì)應(yīng)的IP地址,這樣才能上網(wǎng)。其實(shí),域名的最終指向是IP。dig 或使用nslookup網(wǎng)絡(luò)基本概念-DNSDHCP是Dynamic

Host

Configuration

Protocol(動(dòng)態(tài)主機(jī)分配協(xié)議)縮寫,它的前身是BOOTP。DHCP

的分配形式首先,必須至少有一臺(tái)

DHCP服務(wù)工作在網(wǎng)絡(luò)上面,它會(huì)監(jiān)聽網(wǎng)絡(luò)的DHCP請(qǐng)求,并與客戶端磋商TCP/IP

的設(shè)定環(huán)境。它提供三種IP

定位方式:Manual

Allocation(手動(dòng)分配)網(wǎng)絡(luò)管理員為某些少數(shù)特定的Host綁定固定IP地址,且地址不會(huì)過期Automatic

Allocation

(自動(dòng)分配)自動(dòng)分配,其情形是:一旦DHCP客戶端第一次成功的從DHCP服務(wù)器端租用到IP

地址之后,就永遠(yuǎn)使用這個(gè)地址。Dynamic

Allocation

(動(dòng)態(tài)分配)動(dòng)態(tài)分配,當(dāng)DHCP第一次從DHCP服務(wù)器端租用到IP地址之后,并非永久的使用該地址,只要租約到期,客戶端就得釋放(release)這個(gè)IP

地址,以給其它工作站使用。網(wǎng)絡(luò)基本概念-DHCPpppoe是point-to-point

protocol

over

ethernet的簡稱,可以使以太網(wǎng)的主機(jī)通過一個(gè)簡單的橋接設(shè)備連到一個(gè)遠(yuǎn)端的接入集中器上。通過

pppoe協(xié)議,遠(yuǎn)端接入設(shè)備能夠?qū)崿F(xiàn)對(duì)每個(gè)接入用戶的控制和計(jì)費(fèi)。與傳統(tǒng)的接入方式相比,pppoe具有較高的性能價(jià)格比,它在包括

小區(qū)組網(wǎng)建設(shè)等一系列應(yīng)用中被廣泛采用,目前流行的寬帶接入方式adsl就使用了pppoe協(xié)議。網(wǎng)絡(luò)基本概念-PPPOERPC:為遠(yuǎn)程過程調(diào)用(Remote

Procedure

Call

Protocol)XMLRPC:為基于XML格式的RPC

SOAP:簡單對(duì)象訪問協(xié)議(Simple

Object

Access

Protocol)簡單對(duì)象訪問協(xié)議(SOAP)是一種輕量的、簡單的、基于XML的協(xié)議,它被設(shè)計(jì)成在WEB

上交換結(jié)構(gòu)化的和固化的信息。SOAP可以和現(xiàn)存的許多因特網(wǎng)協(xié)議和格式結(jié)合使用,包括超文本傳輸協(xié)議(

HTTP),簡單郵件傳輸協(xié)議(SMTP),多用途網(wǎng)際郵件擴(kuò)充協(xié)議(MIME)。它還支持從消息系統(tǒng)到遠(yuǎn)程過程調(diào)用(RPC)等大量的應(yīng)用程序。網(wǎng)絡(luò)基本概念-RPCB/S架構(gòu):(Browser/Server,瀏覽器/服務(wù)器模式),是WEB興起后的一種網(wǎng)絡(luò)結(jié)構(gòu)模式,WEB瀏覽器是客戶端最主要的應(yīng)用軟件。這種模式統(tǒng)一了客戶端,將系統(tǒng)功能實(shí)現(xiàn)的核心部分集中到服務(wù)器上,簡化了系統(tǒng)的開發(fā)、維護(hù)和使用。C/S架構(gòu):(Client/Server或客戶/服務(wù)器模式),Client和Server常常分別處在相距很遠(yuǎn)的兩臺(tái)計(jì)算機(jī)上,Client程序的任務(wù)是將用戶的要求提交給Server程序,再將Server程序返回的結(jié)果以特定的形式顯示給用戶;Server程序的任務(wù)是接收客戶程序提出的服務(wù)請(qǐng)求,進(jìn)行相應(yīng)的處理,再將結(jié)果返回給客戶程序。網(wǎng)絡(luò)基本概念-B/S與C/SFTP–文件傳輸協(xié)議(file

transfer

protocol)SMTP–簡單郵件傳輸協(xié)議(Simple

mail

transfer

protocol)POP3–郵局協(xié)議(Post

office

protocol

3)HTTP–超

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論