Unix程序設(shè)計(jì)基礎(chǔ)第三講_第1頁
Unix程序設(shè)計(jì)基礎(chǔ)第三講_第2頁
Unix程序設(shè)計(jì)基礎(chǔ)第三講_第3頁
Unix程序設(shè)計(jì)基礎(chǔ)第三講_第4頁
Unix程序設(shè)計(jì)基礎(chǔ)第三講_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、Unix程序設(shè)計(jì)基礎(chǔ) 第三講2004-2-101Reviews of last class進(jìn)程獨(dú)立地址空間的指令序列五種狀態(tài)基本狀態(tài):新建,就緒,運(yùn)行,睡眠,僵死狀態(tài)轉(zhuǎn)換圖進(jìn)程ID,子進(jìn)程,父進(jìn)程Unix下的多進(jìn)程編程fork與execve:進(jìn)程的創(chuàng)建與程序的運(yùn)行wait,waitpid:回收子進(jìn)程的退出狀態(tài)2Reviews of last class信號是Unix操作系統(tǒng)用來通知進(jìn)程發(fā)生了某種事件的一種手段。也稱為軟件中斷幾個(gè)常用的信號信號編程signal與sigaction:改變信號動(dòng)作alarm:設(shè)置鬧鐘不可重入函數(shù):在函數(shù)返回之前不可再次被調(diào)用,如printf,malloc。3信號編程

2、(續(xù))功能更強(qiáng)的改變信號動(dòng)作函數(shù):sigaction。解決早期signal函數(shù)的不可靠問題:在信號處理過程中再次收到這個(gè)信號怎么辦?一般情況下用不到,請自己看書。發(fā)送信號函數(shù)kill與raise。函數(shù)原型:#include int kill(pid_t pid, int sig);int raise(int sig);4信號的發(fā)送kill給進(jìn)程號為pid的進(jìn)程發(fā)送一個(gè)sig信號pid 0:發(fā)送給進(jìn)程ID為pid的進(jìn)程pid = 0:發(fā)送給與自己同組,并且自己有權(quán)限向其發(fā)送的進(jìn)程pid -1:發(fā)送給進(jìn)程組ID為-pid的進(jìn)程,并且自己有權(quán)限向其發(fā)送的進(jìn)程pid = -1:所有自己有權(quán)限向其發(fā)送信

3、號的進(jìn)程5信號的發(fā)送raise調(diào)用給自己發(fā)關(guān)一個(gè)sig信號。因此,raise(sig);等價(jià)于kill(getpid(), sig);發(fā)送信號的shell命令:kill。在默認(rèn)情況下發(fā)送的是SIGTERM信號$ kill 12345 等價(jià)于 $ kill TERM 12345,都是向進(jìn)程12345發(fā)送一個(gè)SIGTERM信號。$ kill KILL 12345,向進(jìn)程12345發(fā)送一個(gè)SIGKILL信號6信號的屏蔽在一段時(shí)間內(nèi)屏蔽掉某些信號,讓當(dāng)前進(jìn)程接收不到這些信號。與忽略信號(remember?)不同,被屏蔽的信號會(huì)被保存起來(但不排隊(duì)),在屏蔽解除后會(huì)被進(jìn)程收到。注意一點(diǎn):一般情況下用si

4、gnal函數(shù)設(shè)置信號動(dòng)作,在某信號處理過程中,該信號是被屏蔽的。7實(shí)例:SIGCHLD信號不詳細(xì)講關(guān)于信號屏蔽的系統(tǒng)調(diào)用,因?yàn)椴皇呛苤匾?,而且?nèi)容太多。但我想通過一個(gè)例子來讓大家了解信號屏蔽:某個(gè)進(jìn)程通過調(diào)用fork創(chuàng)建多個(gè)子進(jìn)程: for (i = 0; i n; i+) if (pid = fork() = 0) break; 8實(shí)例:SIGCHLD信號當(dāng)父進(jìn)程給束之前,必須調(diào)用wait來回收子進(jìn)程的退出狀態(tài),如: for (i = 0; i 0) ; 13進(jìn)程間通信(IPC)著名Unix與網(wǎng)絡(luò)專家Richard Stevens,有多本Unix著作,本本經(jīng)典。Advanced Progra

5、mming In the Unix Environment (APUE)TCP/IP Illustrated volume 1, 2, 3Unix Network Programming (UNP) volume 1, 21999年9月30號去世TT,UNP volume 3沒有寫完。14進(jìn)程間通信(IPC)UNP volume 2:用了一本書來講IPC所以,我不可能在半節(jié)課之內(nèi)涵蓋IPC的各個(gè)方面,只能講一些最基本,也是最重要的:管道通信FIFO通信15管道通信最古老的Unix IPC工具,一個(gè)進(jìn)程從管道一頭寫數(shù)據(jù),另一個(gè)進(jìn)程從管道另一頭讀數(shù)據(jù)。相通信方式是單向的。(演示shell下的管道通

6、信)先了解一下進(jìn)程創(chuàng)建過程中文件描述字的繼承。16單個(gè)進(jìn)程打開兩個(gè)文件17fork之后18管道通信創(chuàng)建管道pipe函數(shù)原型:#include int pipe(int fdes2); pipe函數(shù)成功后,內(nèi)核打開兩個(gè)文件描述字fdes0,fdes1。fdes0輸入端,fdes1為輸出端。19當(dāng)進(jìn)程調(diào)用了pipe20fork被調(diào)用后21兩個(gè)進(jìn)程分別關(guān)閉一個(gè)端22int main(void) pid_t pid; int fdes2; if (pipe(fdes) 0) perror(“pipe”); exit(1); if (pid = fork() 0) close(fdes0); write

7、(fdes1, “Hmmmmmmmmmmm”, 12); /* 1 2 3 4 5 6 7 8 9 0 1 2 */ else char buf4096; ssize_t n; close(fdes1) n = read(fdes0, buf, 4096); if (n = 0) bufn = 0; printf(“%sn”, buf); return 0;23管道破裂如果一個(gè)管道的讀端已經(jīng)關(guān)閉,進(jìn)程還繼續(xù)向?qū)懚藢憯?shù)據(jù),如: pipe(fdes); close(fdes0); write(fdes1, “Let me die”, 10); 則進(jìn)程會(huì)收到一個(gè)SIGPIPE信號,表示管道破裂。默認(rèn)

8、動(dòng)作為結(jié)束進(jìn)程。讀一個(gè)寫端已經(jīng)關(guān)閉的管道則read返回0。24FIFO通信FIFO是一種特殊設(shè)備文件,又稱為有名管道。操作方法與普通文件相同。對于普通文件,我們可以從文件任一位置讀數(shù)據(jù),也可以從任一位置寫數(shù)據(jù);數(shù)據(jù)讀完不會(huì)消失。但對FIFO來說,我們只能從文件頭讀數(shù)據(jù),從文件尾寫數(shù)據(jù)。數(shù)據(jù)被某進(jìn)程讀走之后就會(huì)消失。(實(shí)例演示)25FIFO相關(guān)的調(diào)用和shell命令創(chuàng)建設(shè)備文件FIFO:mkfifo 函數(shù)原型: #include #include int mkfifo(const char *, mode_t mode);shell命令: $ mkfifo m 0600 fifo126線程簡介L

9、inux下的clone系統(tǒng)調(diào)用可以實(shí)現(xiàn)比fork更多的功能,比如讓創(chuàng)建出來的子進(jìn)程分享父進(jìn)程的地址空間。習(xí)慣上把這些與父進(jìn)程分享地址空間的子進(jìn)程稱為線程(Thread)。不同的系統(tǒng)對線程有不一樣的定義,但相同之處是它比進(jìn)程的開消小,因此也被稱為是輕量級進(jìn)程。27線程簡介因?yàn)榈刂房臻g共享使得線程之間的通信非常方便,但必須特別注意數(shù)據(jù)一致性。Posix定了標(biāo)準(zhǔn)的線程接口,請參考UNP volume 1,Chapter 2328高級IOI/O的方式有很多種,我們之前使用的IO方式的特點(diǎn)是:單路:只能等待一個(gè)fd可讀或可寫阻塞:睡眠直到fd可讀或可寫同步:read和write必須結(jié)束才返回?因此有與之

10、對應(yīng)的:多路:同時(shí)等待多個(gè)fd可讀或可寫非阻塞:fd不可讀或不可寫立即返回異步:I/O沒有結(jié)束read和write也可返回29非阻塞I/O以非阻塞方式打開一個(gè)文件,如:fd = open(“l(fā)ove.txt”, O_RDWR | O_NONBLOCK, 0);也可以用fcntl讓一個(gè)已經(jīng)打開的文件描述字變成非阻塞: flags = fcntl(fd, F_GETFL, 0); fcntl(fd, F_SETFL, flags | O_NONBLOCK);30非阻塞I/O對一個(gè)非阻塞的fd來說,如果它無數(shù)據(jù)可讀,則read(fd, );返回-1,errno的值被置為EAGAIN;同樣,如果它暫時(shí)

11、不可寫,write(fd, );返回-1,errno=EAGAIN。(阻塞式I/O在這兩種情況下都是等待)。注意:應(yīng)當(dāng)區(qū)為無數(shù)據(jù)可讀與文件已經(jīng)讀到結(jié)尾。后者read返回0,無論阻塞否。非阻塞I/O經(jīng)常與多路I/O配合使用。31多路I/O想像一個(gè)fd集合fdset,以及一個(gè)函數(shù)fun,我們指定:調(diào)用fun(fdset)進(jìn)程進(jìn)入睡眠,直到fdset中至少有一個(gè)fd可讀,此時(shí)fun返回并把可讀的fd保存在fdset中。這樣做的好處是,我們可以同時(shí)從多個(gè)fd中等待數(shù)據(jù),如果某一個(gè)可讀我們就從中讀取,否則就睡眠。32多路I/OUnix下就存在這種的一個(gè)fun,但它的功能更加強(qiáng)大。它就是select(在有的系統(tǒng)下為poll,Linux都支持) 函數(shù)原型:#include

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論