




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Linux Linux 系統(tǒng)編程系統(tǒng)編程實(shí)驗(yàn)實(shí)驗(yàn) linuxlinux系統(tǒng)編程系統(tǒng)編程LinuxLinux下下C C語(yǔ)言編程方法語(yǔ)言編程方法1 1、編譯方法、編譯方法 例如一個(gè)例如一個(gè)hello.chello.c的程序的程序 gcc gcc o hello hello.c o hello hello.c2 2、運(yùn)行方法、運(yùn)行方法 在當(dāng)前目錄下敲入在當(dāng)前目錄下敲入 Hello Hello 或者或者 ./ ./hello ./hello ./表示當(dāng)前目錄表示當(dāng)前目錄實(shí)驗(yàn)實(shí)驗(yàn) linuxlinux系統(tǒng)編程系統(tǒng)編程一一 進(jìn)程的基本介紹進(jìn)程的基本介紹1 11 1、取得進(jìn)程、取得進(jìn)程PCBPCB的標(biāo)識(shí)的標(biāo)
2、識(shí) getpidgetpid()() getppidgetppid() ()2 2、創(chuàng)建進(jìn)程、創(chuàng)建進(jìn)程 fork() exec()fork() exec()3 3、進(jìn)程的同步進(jìn)程的同步 wait()wait()4 4、進(jìn)程的終止進(jìn)程的終止 exit() exit() 實(shí)驗(yàn)實(shí)驗(yàn) linuxlinux系統(tǒng)編程系統(tǒng)編程進(jìn)程進(jìn)程PCBPCB的標(biāo)識(shí)的標(biāo)識(shí)getpid的作用很簡(jiǎn)單,就是返回當(dāng)前進(jìn)程的進(jìn)程的作用很簡(jiǎn)單,就是返回當(dāng)前進(jìn)程的進(jìn)程ID,請(qǐng)大家看以下的例子:請(qǐng)大家看以下的例子:# #include /include /* * 提供類型提供類型pidpid_t _t的定義的定義 * */ / # #i
3、ncludeinclude /.h /* * 提供函數(shù)的定義提供函數(shù)的定義 * */ / pidpid_t _t getpid getpid(void); (void); Int getpidInt getpid(void); (void); 同理同理getppidgetppid() ()/ /* * getpidgetpid_test.c _test.c * */ / # #includeinclude /.h /* * 提供函數(shù)的定義提供函數(shù)的定義 * */ / Main()Main() printfprintf(“ my parent ID is:%dn”,(“ my parent ID
4、 is:%dn”,getppidgetppid();(); printfprintf(“my ID is:%dn”,(“my ID is:%dn”,getpidgetpid();(); 實(shí)驗(yàn)實(shí)驗(yàn) linuxlinux系統(tǒng)編程系統(tǒng)編程創(chuàng)建進(jìn)程創(chuàng)建進(jìn)程fork命令命令fork系統(tǒng)調(diào)用的作用是復(fù)制一個(gè)系統(tǒng)調(diào)用的作用是復(fù)制一個(gè)子子進(jìn)程。當(dāng)一個(gè)進(jìn)程調(diào)用進(jìn)程。當(dāng)一個(gè)進(jìn)程調(diào)用fork后后,完成后就出現(xiàn)兩個(gè),完成后就出現(xiàn)兩個(gè)幾乎幾乎一模一樣的進(jìn)程一模一樣的進(jìn)程(克隆克?。#?。先看如下例子先看如下例子/ /* * fork_test1.c fork_test1.c * */ /的運(yùn)行結(jié)果:的運(yùn)行結(jié)果:# #i
5、nclude /include /* * 提供類型提供類型pidpid_t _t的定義的定義 * */ / # #includeinclude /.h /* * 提供函數(shù)的定義提供函數(shù)的定義 * */ / pidpid_t fork(void); _t fork(void); Int getpidInt getpid(void); (void); # #includeinclude /.h /* * 提供函數(shù)的定義提供函數(shù)的定義 * */ / Main()Main() int pidint pid; ; printfprintf(“onen”);(“onen”); pidpid=fork();
6、=fork(); printfprintf(“my ID is:%dn”,(“my ID is:%dn”,getpidgetpid();(); 實(shí)驗(yàn)實(shí)驗(yàn) linuxlinux系統(tǒng)編程系統(tǒng)編程Printf(“onen”);Pid=fork();Printf(“twon”);輸出字符輸出字符“one”A進(jìn)程fork創(chuàng)建子進(jìn)程后創(chuàng)建子進(jìn)程后,父子進(jìn)程在內(nèi)父子進(jìn)程在內(nèi)存不同的地方。代碼完全一樣,存不同的地方。代碼完全一樣,克隆人。并且克隆人。并且pc指針指向指針指向fork后后的下一個(gè)操作的下一個(gè)操作(賦值賦值)。Pid的值在父的值在父子進(jìn)程中的值不相同。子進(jìn)程中的值不相同。Printf(“onen”
7、);Pid=fork();Printf(“twon”);A進(jìn)程(父)Printf(“onen”);Pid=fork();Printf(“twon”);B進(jìn)程(子)Pid0Pid=0父子進(jìn)程的區(qū)別除了進(jìn)程標(biāo)志符父子進(jìn)程的區(qū)別除了進(jìn)程標(biāo)志符pID不同不同外,變量外,變量pid的值也不相同,的值也不相同,pid存放的存放的是是fork的返回值。的返回值。fork調(diào)用的一個(gè)奇妙調(diào)用的一個(gè)奇妙之處就是它僅僅被調(diào)用一次,卻能夠返回之處就是它僅僅被調(diào)用一次,卻能夠返回兩次,它可能有三種不同的返回值:兩次,它可能有三種不同的返回值:1.在父進(jìn)程中,fork返回新創(chuàng)建子進(jìn)程的進(jìn)程ID; 2.在子進(jìn)程中,fork
8、返回0; 3.如果出現(xiàn)錯(cuò)誤,fork返回一個(gè)負(fù)值;實(shí)驗(yàn)實(shí)驗(yàn) linuxlinux系統(tǒng)編程系統(tǒng)編程/ /* * fork_test2.c fork_test2.c * */ / #include#include # #inlcudeinlcude .h main() main() pid pid_t _t pid pid; ; / /* *此時(shí)僅有一個(gè)進(jìn)程此時(shí)僅有一個(gè)進(jìn)程* */ / pidpid=fork();=fork(); / /* *此時(shí)已經(jīng)有兩個(gè)進(jìn)程在同時(shí)運(yùn)行此時(shí)已經(jīng)有兩個(gè)進(jìn)程在同時(shí)運(yùn)行* */ / if(if(pidpid0) 0) printf printf(error in fo
9、rk!);(error in fork!); else if( else if(pidpid=0) =0) printf printf(I am the child , my process ID is %dn,(I am the child , my process ID is %dn,getpidgetpid();(); else else printf printf(I am the parent, my process ID is %dn,(I am the parent, my process ID is %dn,getpidgetpid();(); 實(shí)驗(yàn)實(shí)驗(yàn) linuxlinux系
10、統(tǒng)編程系統(tǒng)編程思考如下兩個(gè)程序,判別總共有多少并發(fā)進(jìn)程?能否畫出其進(jìn)思考如下兩個(gè)程序,判別總共有多少并發(fā)進(jìn)程?能否畫出其進(jìn)程的家族圖程的家族圖Main()Main()fork();fork(); fork(); fork(); fork(); fork(); Main()Main() for(;) fork();for(;) fork(); Main()Main() fork(); fork(); fork(); fork(); 實(shí)驗(yàn)實(shí)驗(yàn) linuxlinux系統(tǒng)編程系統(tǒng)編程創(chuàng)建進(jìn)程創(chuàng)建進(jìn)程execl命令命令ForkFork程序只能賦值一個(gè)副本,而程序只能賦值一個(gè)副本,而execexec可以運(yùn)
11、行一個(gè)新的程可以運(yùn)行一個(gè)新的程序,并覆蓋原先調(diào)用的程序空間。序,并覆蓋原先調(diào)用的程序空間。# #includeinclude /.h /* * 提供函數(shù)的定義提供函數(shù)的定義 * */ / Int execlInt execl(const char (const char * *path,const char path,const char * *argarg_i,(char _i,(char * *)0);)0);ExeclExecl(“ (“新程序路徑新程序路徑”,“新程序名新程序名”,參數(shù),參數(shù),( (char char * *)0);)0);# #includeinclude /.h /
12、* * 提供函數(shù)的定義提供函數(shù)的定義 * */ / Main()Main() printfprintf(“Ready to executing (“Ready to executing ls lsn”);n”); execlexecl(“/bin/(“/bin/ls ls”,”,”ls ls”,”-l”,(char ”,”-l”,(char * *)0);)0); 例如:例如:execlexecl_test.c_test.c實(shí)驗(yàn)實(shí)驗(yàn) linuxlinux系統(tǒng)編程系統(tǒng)編程ExeclExecl的功能:的功能:裝載一個(gè)新的程序裝載一個(gè)新的程序, ,并將之轉(zhuǎn)換到調(diào)用進(jìn)程的內(nèi)存空間。并將之轉(zhuǎn)換到調(diào)用進(jìn)程
13、的內(nèi)存空間。如果調(diào)用成功,調(diào)用程序?qū)⒈恍碌某绦蛲耆采w,并從新程序如果調(diào)用成功,調(diào)用程序?qū)⒈恍碌某绦蛲耆采w,并從新程序的起始處開始執(zhí)行。的起始處開始執(zhí)行。結(jié)果可以認(rèn)為是創(chuàng)建一個(gè)新的進(jìn)程,但是進(jìn)程結(jié)果可以認(rèn)為是創(chuàng)建一個(gè)新的進(jìn)程,但是進(jìn)程PIDPID和原來(lái)的進(jìn)和原來(lái)的進(jìn)程相同。程相同。Main()Printf(“.”);Execl(“/bin/.);原進(jìn)程空間Ls的程序代碼的程序代碼新進(jìn)程空間實(shí)驗(yàn)實(shí)驗(yàn) linuxlinux系統(tǒng)編程系統(tǒng)編程思考如下的例子,思考如下的例子,/ /* * fork_fork_execlexecl.c .c * */ / # #inlcudeinlcude .h mai
14、n() main() int pidint pid; ; pidpid=fork();=fork(); switch( switch(pidpid) ) case 1: case 1: printfprintf(“fork error!n”); break;(“fork error!n”); break; case 0 : case 0 : execlexecl(“/bin/(“/bin/ls ls”,”,”ls ls”,”-l”,(char ”,”-l”,(char * *)0);break;)0);break; default: default:printfprintf(“this is
15、parent doing something”);exit(0);(“this is parent doing something”);exit(0); 實(shí)驗(yàn)實(shí)驗(yàn) linuxlinux系統(tǒng)編程系統(tǒng)編程進(jìn)程同步進(jìn)程同步- -waitwait()()有時(shí)候我們希望子進(jìn)程繼續(xù)執(zhí)行,而父進(jìn)程阻塞(等待)直到有時(shí)候我們希望子進(jìn)程繼續(xù)執(zhí)行,而父進(jìn)程阻塞(等待)直到子進(jìn)程完成任務(wù)。這個(gè)時(shí)候我們可以調(diào)用子進(jìn)程完成任務(wù)。這個(gè)時(shí)候我們可以調(diào)用wait.wait.waitwait系統(tǒng)調(diào)用會(huì)使父進(jìn)程阻塞直到某一個(gè)子進(jìn)程結(jié)束或者是系統(tǒng)調(diào)用會(huì)使父進(jìn)程阻塞直到某一個(gè)子進(jìn)程結(jié)束或者是父進(jìn)程接受到了一個(gè)信號(hào)。如果父進(jìn)程沒有子進(jìn)
16、程或者他的子父進(jìn)程接受到了一個(gè)信號(hào)。如果父進(jìn)程沒有子進(jìn)程或者他的子進(jìn)程已經(jīng)結(jié)束了進(jìn)程已經(jīng)結(jié)束了waitwait回立即返回回立即返回成功時(shí)成功時(shí)( (因一個(gè)子進(jìn)程結(jié)束因一個(gè)子進(jìn)程結(jié)束) )waitwait將返回子進(jìn)程的將返回子進(jìn)程的IDID,否則返否則返回回-1-1# #includeinclude /.h /* * 提供函數(shù)的定義提供函數(shù)的定義 * */ / # #include /include /* * 提供提供pidpid_t _t的定義的定義 * */ /PidPid_t wait(_t wait(int int * *status);status);實(shí)驗(yàn)實(shí)驗(yàn) linuxlinux系統(tǒng)
17、編程系統(tǒng)編程/ /* * wait_test.c wait_test.c * */ / #include#include.h#include#include main() main() int pidint pid, ,wpidwpid; ; pidpid=fork();=fork(); if( if(pidpid=0=0) printfprintf(“this is child,my id is:%dn”,(“this is child,my id is:%dn”,gepidgepid();sleep(4);();sleep(4); else if( else if(pidpid0)0) wpidwpid=wait(0);=wait(0); printfprintf(“child %d is right,now I will continue.n”,(“child %d is right,now I will continue.n”,wpidwpid); ); exit(0); exit(0); 實(shí)驗(yàn)實(shí)驗(yàn) linuxlinux系統(tǒng)編程系統(tǒng)編程進(jìn)程結(jié)束函數(shù)進(jìn)程結(jié)束函數(shù)exitexitExit(0) Exit(0) 正常結(jié)束正常結(jié)束Exit(1) Exit(1) 非正常結(jié)束非正常結(jié)束實(shí)驗(yàn)實(shí)驗(yàn) linuxlinux系統(tǒng)編程系統(tǒng)編程二二 進(jìn)程的進(jìn)程的“軟中斷軟中斷”通信通信用于同一用
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 內(nèi)蒙古北方職業(yè)技術(shù)學(xué)院《跨境電商》2023-2024學(xué)年第二學(xué)期期末試卷
- 鞍山職業(yè)技術(shù)學(xué)院《企業(yè)領(lǐng)導(dǎo)學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 阿克蘇工業(yè)職業(yè)技術(shù)學(xué)院《礦山供電技術(shù)課程設(shè)計(jì)》2023-2024學(xué)年第二學(xué)期期末試卷
- 福建農(nóng)林大學(xué)金山學(xué)院《RPA的財(cái)務(wù)應(yīng)用》2023-2024學(xué)年第二學(xué)期期末試卷
- 黑龍江三江美術(shù)職業(yè)學(xué)院《數(shù)字信號(hào)處理器原理及應(yīng)用》2023-2024學(xué)年第二學(xué)期期末試卷
- 泰山學(xué)院《現(xiàn)代管理學(xué)概論》2023-2024學(xué)年第二學(xué)期期末試卷
- 遂寧工程職業(yè)學(xué)院《審計(jì)模擬實(shí)訓(xùn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 鷹潭職業(yè)技術(shù)學(xué)院《電路與電子學(xué)基礎(chǔ)》2023-2024學(xué)年第二學(xué)期期末試卷
- 貴陽(yáng)康養(yǎng)職業(yè)大學(xué)《建筑安全技術(shù)與原理》2023-2024學(xué)年第二學(xué)期期末試卷
- 哈爾濱工業(yè)大學(xué)《嵌入式操作系統(tǒng)實(shí)驗(yàn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 2023版毛概課后答案
- 歷史小劇場(chǎng)《萬(wàn)隆會(huì)議》劇本
- 設(shè)備(材料)供應(yīng)招標(biāo)文件范本
- 國(guó)家開放大學(xué)《社區(qū)護(hù)理學(xué)(本)》形考任務(wù)1-5參考答案
- 220千伏線路無(wú)人機(jī)放線施工組織設(shè)計(jì)
- (完整版)培訓(xùn)學(xué)校電話話術(shù)(初中)
- 注塑模具標(biāo)準(zhǔn)成型條件表
- 施工進(jìn)度計(jì)劃網(wǎng)絡(luò)圖及橫道圖
- 大貓英語(yǔ)分級(jí)閱讀 二級(jí)2 Let's go shopping 課件
- 《中國(guó)文化概論》課程教學(xué)大綱.docx
- 化妝品注冊(cè)注銷申請(qǐng)表
評(píng)論
0/150
提交評(píng)論