版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
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信號(hào)是Unix操作系統(tǒng)用來(lái)通知進(jìn)程發(fā)生了某種事件的一種手段。也稱(chēng)為軟件中斷幾個(gè)常用的信號(hào)信號(hào)編程signal與sigaction:改變信號(hào)動(dòng)作alarm:設(shè)置鬧鐘不可重入函數(shù):在函數(shù)返回之前不可再次被調(diào)用,如printf,malloc。3信號(hào)編程
2、(續(xù))功能更強(qiáng)的改變信號(hào)動(dòng)作函數(shù):sigaction。解決早期signal函數(shù)的不可靠問(wèn)題:在信號(hào)處理過(guò)程中再次收到這個(gè)信號(hào)怎么辦?一般情況下用不到,請(qǐng)自己看書(shū)。發(fā)送信號(hào)函數(shù)kill與raise。函數(shù)原型:#include int kill(pid_t pid, int sig);int raise(int sig);4信號(hào)的發(fā)送kill給進(jìn)程號(hào)為pid的進(jìn)程發(fā)送一個(gè)sig信號(hào)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、號(hào)的進(jìn)程5信號(hào)的發(fā)送raise調(diào)用給自己發(fā)關(guān)一個(gè)sig信號(hào)。因此,raise(sig);等價(jià)于kill(getpid(), sig);發(fā)送信號(hào)的shell命令:kill。在默認(rèn)情況下發(fā)送的是SIGTERM信號(hào)$ kill 12345 等價(jià)于 $ kill TERM 12345,都是向進(jìn)程12345發(fā)送一個(gè)SIGTERM信號(hào)。$ kill KILL 12345,向進(jìn)程12345發(fā)送一個(gè)SIGKILL信號(hào)6信號(hào)的屏蔽在一段時(shí)間內(nèi)屏蔽掉某些信號(hào),讓當(dāng)前進(jìn)程接收不到這些信號(hào)。與忽略信號(hào)(remember?)不同,被屏蔽的信號(hào)會(huì)被保存起來(lái)(但不排隊(duì)),在屏蔽解除后會(huì)被進(jìn)程收到。注意一點(diǎn):一般情況下用si
4、gnal函數(shù)設(shè)置信號(hào)動(dòng)作,在某信號(hào)處理過(guò)程中,該信號(hào)是被屏蔽的。7實(shí)例:SIGCHLD信號(hào)不詳細(xì)講關(guān)于信號(hào)屏蔽的系統(tǒng)調(diào)用,因?yàn)椴皇呛苤匾?,而且?nèi)容太多。但我想通過(guò)一個(gè)例子來(lái)讓大家了解信號(hào)屏蔽:某個(gè)進(jìn)程通過(guò)調(diào)用fork創(chuàng)建多個(gè)子進(jìn)程: for (i = 0; i n; i+) if (pid = fork() = 0) break; 8實(shí)例:SIGCHLD信號(hào)當(dāng)父進(jìn)程給束之前,必須調(diào)用wait來(lái)回收子進(jìn)程的退出狀態(tài),如: for (i = 0; i 0) ; 13進(jìn)程間通信(IPC)著名Unix與網(wǎng)絡(luò)專(zhuān)家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號(hào)去世TT,UNP volume 3沒(méi)有寫(xiě)完。14進(jìn)程間通信(IPC)UNP volume 2:用了一本書(shū)來(lái)講IPC所以,我不可能在半節(jié)課之內(nèi)涵蓋IPC的各個(gè)方面,只能講一些最基本,也是最重要的:管道通信FIFO通信15管道通信最古老的Unix IPC工具,一個(gè)進(jìn)程從管道一頭寫(xiě)數(shù)據(jù),另一個(gè)進(jìn)程從管道另一頭讀數(shù)據(jù)。相通信方式是單向的。(演示shell下的管道通
6、信)先了解一下進(jìn)程創(chuàng)建過(guò)程中文件描述字的繼承。16單個(gè)進(jìn)程打開(kāi)兩個(gè)文件17fork之后18管道通信創(chuàng)建管道pipe函數(shù)原型:#include int pipe(int fdes2); pipe函數(shù)成功后,內(nèi)核打開(kā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ū)懚藢?xiě)數(shù)據(jù),如: pipe(fdes); close(fdes0); write(fdes1, “Let me die”, 10); 則進(jìn)程會(huì)收到一個(gè)SIGPIPE信號(hào),表示管道破裂。默認(rèn)
8、動(dòng)作為結(jié)束進(jìn)程。讀一個(gè)寫(xiě)端已經(jīng)關(guān)閉的管道則read返回0。24FIFO通信FIFO是一種特殊設(shè)備文件,又稱(chēng)為有名管道。操作方法與普通文件相同。對(duì)于普通文件,我們可以從文件任一位置讀數(shù)據(jù),也可以從任一位置寫(xiě)數(shù)據(jù);數(shù)據(jù)讀完不會(huì)消失。但對(duì)FIFO來(lái)說(shuō),我們只能從文件頭讀數(shù)據(jù),從文件尾寫(xiě)數(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線程簡(jiǎn)介L(zhǎng)
9、inux下的clone系統(tǒng)調(diào)用可以實(shí)現(xiàn)比f(wàn)ork更多的功能,比如讓創(chuàng)建出來(lái)的子進(jìn)程分享父進(jìn)程的地址空間。習(xí)慣上把這些與父進(jìn)程分享地址空間的子進(jìn)程稱(chēng)為線程(Thread)。不同的系統(tǒng)對(duì)線程有不一樣的定義,但相同之處是它比進(jìn)程的開(kāi)消小,因此也被稱(chēng)為是輕量級(jí)進(jìn)程。27線程簡(jiǎn)介因?yàn)榈刂房臻g共享使得線程之間的通信非常方便,但必須特別注意數(shù)據(jù)一致性。Posix定了標(biāo)準(zhǔn)的線程接口,請(qǐng)參考UNP volume 1,Chapter 2328高級(jí)IOI/O的方式有很多種,我們之前使用的IO方式的特點(diǎn)是:?jiǎn)温罚褐荒艿却粋€(gè)fd可讀或可寫(xiě)阻塞:睡眠直到fd可讀或可寫(xiě)同步:read和write必須結(jié)束才返回?因此有與之
10、對(duì)應(yīng)的:多路:同時(shí)等待多個(gè)fd可讀或可寫(xiě)非阻塞:fd不可讀或不可寫(xiě)立即返回異步:I/O沒(méi)有結(jié)束read和write也可返回29非阻塞I/O以非阻塞方式打開(kāi)一個(gè)文件,如:fd = open(“l(fā)ove.txt”, O_RDWR | O_NONBLOCK, 0);也可以用fcntl讓一個(gè)已經(jīng)打開(kāi)的文件描述字變成非阻塞: flags = fcntl(fd, F_GETFL, 0); fcntl(fd, F_SETFL, flags | O_NONBLOCK);30非阻塞I/O對(duì)一個(gè)非阻塞的fd來(lái)說(shuō),如果它無(wú)數(shù)據(jù)可讀,則read(fd, );返回-1,errno的值被置為EAGAIN;同樣,如果它暫時(shí)
11、不可寫(xiě),write(fd, );返回-1,errno=EAGAIN。(阻塞式I/O在這兩種情況下都是等待)。注意:應(yīng)當(dāng)區(qū)為無(wú)數(shù)據(jù)可讀與文件已經(jīng)讀到結(jié)尾。后者read返回0,無(wú)論阻塞否。非阻塞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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- PQA-18-生命科學(xué)試劑-MCE-3779
- Filiformine-生命科學(xué)試劑-MCE-8234
- 11-Hydroxy-9-R-hexahydrocannabinol-生命科學(xué)試劑-MCE-8544
- 4-Iso-THC-4-Iso-tetrahydrocannabinol-生命科學(xué)試劑-MCE-2807
- 2025年度磚廠承包與市場(chǎng)拓展合作協(xié)議
- 2025年新推出門(mén)面房出租管理服務(wù)合同
- 二零二五年度企業(yè)自愿離職合同解除范本及離職補(bǔ)償金計(jì)算標(biāo)準(zhǔn)
- 二零二五年度數(shù)字音樂(lè)版權(quán)互惠合作合同
- 二零二五年度洗煤廠煤炭洗選技術(shù)租賃合同
- 智能科技與家庭旅游的融合探索
- 2024全國(guó)能源行業(yè)火力發(fā)電集控值班員理論知識(shí)技能競(jìng)賽題庫(kù)(多選題)
- 公司員工外派協(xié)議書(shū)范文
- 信息科技重大版 七年級(jí)上冊(cè) 互聯(lián)網(wǎng)應(yīng)用與創(chuàng)新 第二單元教學(xué)設(shè)計(jì) 互聯(lián)網(wǎng)原理
- 肺栓塞的護(hù)理查房完整版
- 手術(shù)患者手術(shù)部位標(biāo)識(shí)制度
- 運(yùn)輸安全生產(chǎn)知識(shí)培訓(xùn)試卷
- 抖音麗人行業(yè)短視頻直播項(xiàng)目運(yùn)營(yíng)策劃方案
- (2024年)知識(shí)產(chǎn)權(quán)全套課件(完整)
- 2024-2030年中國(guó)城市軌道交通行業(yè)發(fā)展現(xiàn)狀分析及市場(chǎng)供需預(yù)測(cè)報(bào)告
- 預(yù)防靜脈血栓疾病知識(shí)講座
- 《社區(qū)康復(fù)》課件-第十一章 其他疾病的社區(qū)康復(fù)實(shí)踐
評(píng)論
0/150
提交評(píng)論