![操作系統(tǒng)課件與實驗輔導(dǎo)_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/30/c2478232-4e1e-46cd-9e45-077580efdb66/c2478232-4e1e-46cd-9e45-077580efdb661.gif)
![操作系統(tǒng)課件與實驗輔導(dǎo)_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/30/c2478232-4e1e-46cd-9e45-077580efdb66/c2478232-4e1e-46cd-9e45-077580efdb662.gif)
![操作系統(tǒng)課件與實驗輔導(dǎo)_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/30/c2478232-4e1e-46cd-9e45-077580efdb66/c2478232-4e1e-46cd-9e45-077580efdb663.gif)
![操作系統(tǒng)課件與實驗輔導(dǎo)_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/30/c2478232-4e1e-46cd-9e45-077580efdb66/c2478232-4e1e-46cd-9e45-077580efdb664.gif)
![操作系統(tǒng)課件與實驗輔導(dǎo)_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/30/c2478232-4e1e-46cd-9e45-077580efdb66/c2478232-4e1e-46cd-9e45-077580efdb665.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、2009nLinux實驗環(huán)境n系統(tǒng)調(diào)用n其他問題n實驗講解n系統(tǒng)常用命令n編輯器n編譯器n調(diào)試器n顯示目錄文件 lsn執(zhí)行格式: ls -atFlgR name (name可為文件或目錄名稱)例: ls 顯示出當(dāng)前目錄下的文件ls -a 顯示出包含隱藏文件的所有文件ls -t 按照文件最后修改時間顯示文件 ls -F 顯示出當(dāng)前目錄下的文件及其類型ls -l 顯示目錄下所有文件的許可權(quán)、擁有者、文件大 小、修改時間及名稱ls -lg 同上ls -R 顯示出該目錄及其子目錄下的文件 n建新目錄 mkdirn執(zhí)行格式: mkdir directory-name例: mkdir dir1新建一個名字
2、為dir1的目錄n刪除目錄rmdirn執(zhí)行格式: rmdir directory-name 或 rm directory-name例:rmdir dir1 刪除目錄dir1,但它必須是空目錄,否則無法刪除rm -r dir1 刪除目錄dir1及其下所有文件及子目錄rm -rf dir1 不管是否空目錄,統(tǒng)統(tǒng)刪除,而且不給出提示,使用時要小心n改變工作目錄位置 cdn執(zhí)行格式: cd name 例: cd 改變目錄位置至用戶login時的working directorycd dir1 改變目錄位置,至dir1目錄cd user 改變目錄位置,至用戶的working directorycd .
3、改變目錄位置,至當(dāng)前目錄的上層目錄cd ./user 改變目錄位置,至上一級目錄下的user目錄cd /dir-name1/dir-name2 改變目錄位置,至絕對路徑cd - 回到進(jìn)入當(dāng)前目錄前的上一個目錄n顯示當(dāng)前所在目錄 pwdn執(zhí)行格式: pwd刪除文件 rm執(zhí)行格式: rm filename 例: rm file 刪除名字為file的文件n復(fù)制文件 cpn執(zhí)行格式: cp -r source destination 例: cp file1 file2 將file1復(fù)制成file2cp file1 dir1 將file1復(fù)制到目錄dir1cp /tmp/file1 將file1復(fù)制到當(dāng)
4、前目錄cp /tmp/file1 file2 將file1 復(fù)制到當(dāng)前目錄名為 file2cp r dir1 dir2 (recursive copy)復(fù)制整個目 錄。 n移動或更改文件、目錄名稱 mvn執(zhí)行格式: mv source destination例: mv file1 file2 將文件file1,更名為file2mv file1 dir1 將文件file1,移到目錄dir1 下mv dir1 dir2 將目錄dir1,更名為dir2n查看系統(tǒng)目前的進(jìn)程 ps n執(zhí)行格式: ps -aux例: ps 或ps -x 查看系統(tǒng)中屬于自己的processps -au 查看系統(tǒng)中所有使用者
5、的processps -aux 查看系統(tǒng)中包含系統(tǒng)內(nèi)部及所有使用者 的processps -aux|grep apache 找出系統(tǒng)中運(yùn)行的所有名稱 中帶有“apache”串的 processn結(jié)束或終止進(jìn)程 killn執(zhí)行格式: kill -9 PID (PID為利用ps命令所查出的process ID)例: kill 456kill -9 456 終止process ID 為456的processn命令在線幫助 mann執(zhí)行格式: man command例: man ls 查詢ls這個指令的用法nvi的全稱是visual editor,它是在Unix/Linux 上被廣泛使用的中英文編輯器
6、。n啟動vivi 進(jìn)入vi編輯器界面,沒有為 所編輯的文件命名vi filename 進(jìn)入vi編輯器界面,并將所 編輯的文件命名為filename vi提供三種工作模式:n輸入編輯模式支持:輸入文本信息n命令編輯模式支持:進(jìn)行刪除、修改等操作信息n命令模式支持:進(jìn)行存盤、退出等操作注意:使用者進(jìn)入vi后,即處在命令模式下,要輸入信息,則要切換至輸入模式。命令編輯模式下:在命令模式下:ngedit是Unix/Linux系統(tǒng)下的另一種中英文文本編輯器,支持窗口模式,更加方便快捷。n啟動gedit:gedit 進(jìn)入gedit編輯器界面, 沒有為所編輯的文件命名gedit filename 進(jìn)入ged
7、it編輯器界面, 并將所編輯的文件命名為 filenamenLINUX上可用的C編譯器是GNU C編譯器(GCC),一般的Unix下使用的是CC編譯器n通常后跟一些選項和文件名來使用GCC編譯器?;居梅ㄈ缦拢?gcc options filenamesn通過命令行選項指定編譯過程中的具體操作GCC常用選項nGCC有超過100個的編譯選項可用,這些選項中的許多可能永遠(yuǎn)都不會用到,但一些主要的選項將會頻繁使用。很多的GCC選項包括一個以上的字符,因此必須為每個選項指定各自的連字符,并且就像大多數(shù)LINUX 命令一樣不能在一個單獨的連字符后跟一組選項。例如,下面的命令是不同的: gcc -p -g
8、 test.c gcc -p test.c 第一條命令告訴GCC編譯test.c時為prof命令建立剖析(profile)信息并且把調(diào)試信息加入到可執(zhí)行文件里。第二條命令告訴GCC只為gprof命令建立剖析信息。GCC常用選項n當(dāng)不用任何選項編譯一個程序時,GCC將建立(假定編譯成功)一個名為a.out的可執(zhí)行文件。例如, gcc test.c 編譯成功后,當(dāng)前目錄下就產(chǎn)生了一個a.out文件。n也可用-o選項來為即將產(chǎn)生的可執(zhí)行文件指定一個文件名來代替a.out。例如: gcc o count count.c 此時得到的可執(zhí)行文件就不再是a.out,而是count。執(zhí)行文件 n格式: ./可
9、執(zhí)行文件名例:./a.out ./countnLINUX包含了一個叫g(shù)db的GNU調(diào)試程序。gdb是一個用來調(diào)試C和C+程序的強(qiáng)有力調(diào)試器。它使你能在程序運(yùn)行時觀察程序的內(nèi)部結(jié)構(gòu)和內(nèi)存的使用情況。它具有以下一些功能:監(jiān)視程序中變量的值;設(shè)置斷點以使程序在指定的代碼行上停止執(zhí)行;一行行的執(zhí)行代碼。n為了使gdb正常工作,必須使你的程序在編譯時包含調(diào)試信息。調(diào)試信息里包含你程序里的每個變量的類型和在可執(zhí)行文件里的地址映射以及源代碼的行號。gdb利用這些信息使源代碼和機(jī)器碼相關(guān)聯(lián)。n在編譯時用 g 選項打開調(diào)試選項。n調(diào)試命令應(yīng)用舉例(1)設(shè)有一源程序 test.c(2)編譯,gcc -ggdb o
10、 greet greet.c(3)gdb greet ,出現(xiàn)提示符(gdb),此時可在提示符下輸入gdb的命令了,如:(gdb)run(gdb)list(4)退出調(diào)試狀態(tài),返回系統(tǒng)提示符下, (gdb)quitn字面上講,系統(tǒng)調(diào)用(也稱為“syscall”)就是一條類似于“add”或者“jump”的指令。從更高的層面上講,系統(tǒng)調(diào)用是用戶級程序要求操作系統(tǒng)為它做某些事情的途徑。n首先,用戶程序為系統(tǒng)調(diào)用設(shè)置參數(shù)。其中一個參數(shù)是系統(tǒng)調(diào)用編號(稍后對此進(jìn)行詳述)。注意,所有這些都是由庫函數(shù)自動完成的,除非您是使用匯編編程。參數(shù)設(shè)置完成后,程序執(zhí)行“系統(tǒng)調(diào)用”指令。這個指令會導(dǎo)致一個異常:產(chǎn)生一個事件
11、,這個事件會致使處理器跳轉(zhuǎn)到一個新的地址,并開始執(zhí)行那里的代碼。 舉例說明:1.fork( ) 創(chuàng)建進(jìn)程 stdio.h 2.2.waitwait( )等待子進(jìn)程運(yùn)行結(jié)束 stdio.h3.3.exitexit( )終止進(jìn)程的執(zhí)行 stdio.h4.4.lockf(files,function,size) lockf(files,function,size) 鎖定文件 unistd.h 5.5.kill( ) kill( ) 發(fā)送信號發(fā)送信號 signal.h signal.h 6.6.signal( ) signal( ) 預(yù)置對信號的處理方式預(yù)置對信號的處理方式 signal.hsigna
12、l.h 注意:程序中用到系統(tǒng)調(diào)用的時候,要包含相關(guān)的頭文件如: #include fork( ) #include pid_t fork(void); n創(chuàng)建一個新進(jìn)程。 n系統(tǒng)調(diào)用格式: pid=fork( )n參數(shù)定義:int fork( )nfork( )返回值意義如下:0:在子進(jìn)程中,pid變量保存的fork( )返回值為0,表示當(dāng)前進(jìn)程是子進(jìn)程。0:在父進(jìn)程中,pid變量保存的fork( )返回值為子進(jìn)程的id值(進(jìn)程唯一標(biāo)識符)。-1:創(chuàng)建失敗。n如果fork( )調(diào)用成功,它向父進(jìn)程返回子進(jìn)程的PID,并向子進(jìn)程返回0,即fork( )被調(diào)用了一次,但返回了兩次。此時OS在內(nèi)存中
13、建立一個新進(jìn)程,所建的新進(jìn)程是調(diào)用fork( )父進(jìn)程(parent process)的副本,稱為子進(jìn)程(child process)。子進(jìn)程繼承了父進(jìn)程的許多特性,并具有與父進(jìn)程完全相同的用戶級上下文。父進(jìn)程與子進(jìn)程并發(fā)執(zhí)行。核心為fork( )完成以下操作:n為新進(jìn)程分配一進(jìn)程表項和進(jìn)程標(biāo)識符 進(jìn)入fork( )后,核心檢查系統(tǒng)是否有足夠的資源來建立一個新進(jìn)程。若資源不足,則fork( )系統(tǒng)調(diào)用失??;否則,核心為新進(jìn)程分配一進(jìn)程表項和唯一的進(jìn)程標(biāo)識符。n檢查同時運(yùn)行的進(jìn)程數(shù)目 超過預(yù)先規(guī)定的最大數(shù)目時,fork( )系統(tǒng)調(diào)用失敗。n拷貝進(jìn)程表項中的數(shù)據(jù) 將父進(jìn)程的當(dāng)前目錄和所有已打開的數(shù)
14、據(jù)拷貝到子進(jìn)程表項中,并置進(jìn)程的狀態(tài)為“創(chuàng)建”狀態(tài)。n子進(jìn)程繼承父進(jìn)程的所有文件 對父進(jìn)程當(dāng)前目錄和所有已打開的文件表項中的引用計數(shù)加1。n為子進(jìn)程創(chuàng)建進(jìn)程上、下文 進(jìn)程創(chuàng)建結(jié)束,設(shè)子進(jìn)程狀態(tài)為“內(nèi)存中就緒”并返回子進(jìn)程的標(biāo)識符。n子進(jìn)程執(zhí)行 雖然父進(jìn)程與子進(jìn)程程序完全相同,但每個進(jìn)程都有自己的程序計數(shù)器PC(注意子注意子進(jìn)程的進(jìn)程的PC開始位置開始位置),然后根據(jù)pid變量保存的fork( )返回值的不同,執(zhí)行了不同的分支語句。wait( )#include n等待子進(jìn)程運(yùn)行結(jié)束。如果子進(jìn)程沒有完成,父進(jìn)程一直等待。wait( )將調(diào)用進(jìn)程掛起,直至其子進(jìn)程因暫?;蚪K止而發(fā)來軟中斷信號為止。
15、如果在wait( )前已有子進(jìn)程暫?;蚪K止,則調(diào)用進(jìn)程做適當(dāng)處理后便返回。n系統(tǒng)調(diào)用格式:int wait(status)int *status;n其中,status是用戶空間的地址。它的低8位反應(yīng)子進(jìn)程狀態(tài),為0表示子進(jìn)程正常結(jié)束,非0則表示出現(xiàn)了各種各樣的問題;高8位則帶回了exit( )的返回值。exit( )返回值由系統(tǒng)給出。核心對wait( )作以下處理:n首先查找調(diào)用進(jìn)程是否有子進(jìn)程,若無,則返回出錯碼;n若找到一處于“僵死狀態(tài)”的子進(jìn)程,則將子進(jìn)程的執(zhí)行時間加到父進(jìn)程的執(zhí)行時間上,并釋放子進(jìn)程的進(jìn)程表項;n若未找到處于“僵死狀態(tài)”的子進(jìn)程,則調(diào)用進(jìn)程便在可被中斷的優(yōu)先級上睡眠,等
16、待其子進(jìn)程發(fā)來軟中斷信號時被喚醒。exit( )n終止進(jìn)程的執(zhí)行。n系統(tǒng)調(diào)用格式:void exit(status)int status;n其中,status是返回給父進(jìn)程的一個整數(shù),以備查考。n為了及時回收進(jìn)程所占用的資源并減少父進(jìn)程的干預(yù),UNIX/LINUX利用exit( )來實現(xiàn)進(jìn)程的自我終止,通常父進(jìn)程在創(chuàng)建子進(jìn)程時,應(yīng)在進(jìn)程的末尾安排一條exit( ),使子進(jìn)程自我終止。exit(0)表示進(jìn)程正常終止,exit(1)表示進(jìn)程運(yùn)行有錯,異常終止。n如果調(diào)用進(jìn)程在執(zhí)行exit( )時,其父進(jìn)程正在等待它的終止,則父進(jìn)程可立即得到其返回的整數(shù)。 核心須為exit( )完成以下操作:n關(guān)閉
17、軟中斷n回收資源n寫記帳信息n置進(jìn)程為“僵死狀態(tài)”lockf(files,function,size)n用鎖定文件的某些段或者整個文件。n本函數(shù)的頭文件為 #include unistd.hn系統(tǒng)調(diào)用格式:int lockf(files,function,size)int files,function;long size;n其中:files是文件描述符;function是鎖定和解鎖:1表示鎖定,0表示解鎖。size是鎖定或解鎖的字節(jié)數(shù),為0,表示從文件的當(dāng)前位置到文件尾。kill( ) #include n系統(tǒng)調(diào)用格式int kill(pid,sig)int pid,sig;n其中,pid是一
18、個或一組進(jìn)程的標(biāo)識符,參數(shù)sig是要發(fā)送的軟中斷信號。(1)pid0時,核心將信號發(fā)送給進(jìn)程pid。(2)pid=0時,核心將信號發(fā)送給與發(fā)送進(jìn)程同組的所有進(jìn)程。(3)pid=-1時,核心將信號發(fā)送給所有用戶標(biāo)識符真正等于發(fā)送進(jìn)程的有效用戶標(biāo)識號的進(jìn)程。signal( )n預(yù)置對信號的處理方式,允許調(diào)用進(jìn)程控制軟中斷信號。n系統(tǒng)調(diào)用格式signal(sig,function)int sig;void (*func) ( )n其中sig用于指定信號的類型,sig為0則表示沒有收到任何信號,其它信號類型見下頁表格 n內(nèi)容:編寫一段程序,使用系統(tǒng)調(diào)用fork( )創(chuàng)建兩個子進(jìn)程,再用系統(tǒng)調(diào)用sign
19、al( )讓父進(jìn)程捕捉鍵盤上來的中斷信號(即按ctrl+c鍵),當(dāng)捕捉到中斷信號后,父進(jìn)程用系統(tǒng)調(diào)用kill( )向兩個子進(jìn)程發(fā)出信號,子進(jìn)程捕捉到信號后,分別輸出下列信息后終止: Child process 1 is killed by parent! Child process 2 is killed by parent! 父進(jìn)程等待兩個子進(jìn)程終止后,輸出以下信息后終止: Parent process is killed!n實驗要求:(1) 運(yùn)行程序并分析結(jié)果。(2) 在程序中什么位置用了系統(tǒng)調(diào)用wait()和exit(),為什么?n知識要點:進(jìn)程的創(chuàng)建;父進(jìn)程和子進(jìn)程的關(guān)系;信號的種類;
20、自定義信號處理函數(shù);信號的發(fā)送;進(jìn)程終止。n系統(tǒng)調(diào)用:fork, signal, kill, wait, exitsleep, pausen示例程序:n進(jìn)程創(chuàng)建過程l子進(jìn)程是父進(jìn)程的復(fù)制品。例如,子進(jìn)程獲得父進(jìn)程數(shù)據(jù)空間、堆和棧的復(fù)制品。lfork該函數(shù)被調(diào)用一次,但返回兩次。兩次返回的區(qū)別是子進(jìn)程的返回值是0,而父進(jìn)程的返回值則是新子進(jìn)程的進(jìn)程I D。l將子進(jìn)程I D返回給父進(jìn)程的理由是:因為一個進(jìn)程的子進(jìn)程可以多于一個,所以沒有一個函數(shù)使一個進(jìn)程可以獲得其所有子進(jìn)程的進(jìn)程I D。f o r k使子進(jìn)程得到返回值0的理由是:一個進(jìn)程只會有一個父進(jìn)程,所以子進(jìn)程總是可以調(diào)用g e t p p
21、i d以獲得其父進(jìn)程的進(jìn)程I D。n父進(jìn)程和子進(jìn)程的關(guān)系:進(jìn)程樹結(jié)構(gòu) (pstree命令)nfork系統(tǒng)調(diào)用:#include #include pid_t fork(void);返回:子進(jìn)程中為0,父進(jìn)程中為子進(jìn)程I D,出錯為-1n例子 apue8-1.c$ a . o u ta write to stdoutbefore forkpid = 430, glob = 7, var = 89 子 進(jìn) 程 的變量值改變了pid = 429, glob = 6, var = 88 父 進(jìn) 程 的變量值沒有改變l說明:子進(jìn)程復(fù)制了父進(jìn)程數(shù)據(jù)空間、堆和棧。注意,這是子進(jìn)程所擁有的拷貝拷貝。父、子進(jìn)程
22、并不共享這些存儲空間部分。(如果正文段是只讀的,則父、子進(jìn)程共享正文段。)n進(jìn)一步測試,當(dāng)將標(biāo)準(zhǔn)輸出重新定向到一個文件時:$ a.out temp.out$ cat temp.outa write to stdoutbefore forkpid = 432, glob = 7, var = 89before forkpid = 431, glob = 6, var = 88n說明:l子進(jìn)程繼承父進(jìn)程重定向之后的輸出文件;l得到p r i n t f輸出行兩次。其原因是,如果標(biāo)準(zhǔn)輸出連到終端設(shè)備則它是行緩存的,否則它是全緩存的。l在f o r k之前調(diào)用了p r i n t f一次,但當(dāng)調(diào)用f
23、o r k時,該行數(shù)據(jù)仍在緩存中,然后在父進(jìn)程數(shù)據(jù)空間復(fù)制到子進(jìn)程中時,該緩存數(shù)據(jù)也被復(fù)制到子進(jìn)程中。于是那時父、子進(jìn)程各自有了帶該行內(nèi)容的緩存。在e x i t之前的第二個p r i n t f將其數(shù)據(jù)添加到現(xiàn)存的緩存中。當(dāng)每個進(jìn)程終止時,其緩存中的內(nèi)容被寫到相應(yīng)文件中。(兩次)n在重新定向父進(jìn)程的標(biāo)準(zhǔn)輸出時,子進(jìn)程的標(biāo)準(zhǔn)輸出也被重新定向。實際上, f o r k的一個特性是所有由父進(jìn)程打開的描述符都被復(fù)制到子進(jìn)程中。父、子進(jìn)程每個相同的打開描述符共享一個文件表項。nf o r k有兩種用法:l(1) 一個父進(jìn)程希望復(fù)制自己,使父、子進(jìn)程同時執(zhí)行不同的代碼段。這在網(wǎng)絡(luò)服務(wù)進(jìn)程中是常見的父進(jìn)程
24、等待委托者的服務(wù)請求。當(dāng)這種請求到達(dá)時,父進(jìn)程調(diào)用f o r k,使子進(jìn)程處理此請求。父進(jìn)程則繼續(xù)等待下一個服務(wù)請求。l(2) 一個進(jìn)程要執(zhí)行一個不同的程序。這對s h e l l是常見的情況。在這種情況下,子進(jìn)程在從f o r k返回后立即調(diào)用e x e c。n某些操作系統(tǒng)將( 2 )中的兩個操作( f o r k之后執(zhí)行e x e c )組合成一個,并稱其為s p a w n。U N I X將這兩個操作分開,因為在很多場合需要單獨使用f o r k,其后并不跟隨e x e c。另外,將這兩個操作分開,使得子進(jìn)程在f o r k和e x e c之間可以更改自己的屬性。如I / O重新定向、用
25、戶I D、信號排列等。進(jìn)程有三種正常終止法及兩種異常終止法。n(1) 正常終止:l(a) 在m a i n函數(shù)內(nèi)執(zhí)行r e t u r n語句。如在7 . 3節(jié)中所述,這等效于調(diào)用e x i t。l(b) 調(diào)用e x i t函數(shù)。此函數(shù)由ANSI C定義,其操作包括調(diào)用各終止處理程序,然后關(guān)閉所有標(biāo)準(zhǔn)I / O流等。 (c) 調(diào)用_ e x i t系統(tǒng)調(diào)用函數(shù)。此函數(shù)由e x i t調(diào)用,它處理U N I X特定的細(xì)節(jié)。_ e x i t是由P O S I X . 1說明的。n(2) 異常終止:l(a) 調(diào)用a b o r t。它產(chǎn)生S I G A B RT信號,所以是下一種異常終止的一種特例
26、。l(b) 當(dāng)進(jìn)程接收到某個信號時。(第1 0章將較詳細(xì)地說明信號。)進(jìn)程本身(例如調(diào)用a b o r t函數(shù))、其他進(jìn)程和內(nèi)核都能產(chǎn)生傳送到某一進(jìn)程的信號。例如,進(jìn)程越出其地址空間訪問存儲單元,或者除以0,內(nèi)核就會為該進(jìn)程產(chǎn)生相應(yīng)的信號。 #include void exit(int status);n終止進(jìn)程能夠通知其父進(jìn)程它是如何終止的。對于e x i t和_ e x i t,這是依靠傳遞給它們的退出狀態(tài)( exit status)參數(shù)來實現(xiàn)的。在異常終止情況,內(nèi)核(不是進(jìn)程本身)產(chǎn)生一個指示其異常終止原因的終止?fàn)顟B(tài)( termination status)。n在任意一種情況下,該終止進(jìn)
27、程的父進(jìn)程都能用w a i t或w a i t p i d函數(shù)(在下一節(jié)說明)取得其終止?fàn)顟B(tài)。n但是如果父進(jìn)程在子進(jìn)程之前終止,則將如何呢?其回答是對于其父進(jìn)程已經(jīng)終止的所有進(jìn)程,它們的父進(jìn)程都改變?yōu)閕 n i t進(jìn)程。我們稱這些進(jìn)程由i n i t進(jìn)程領(lǐng)養(yǎng)。#include #include pid_t wait(int s t* a t l o c) ;n調(diào)用w a i t或w a i t p i d的進(jìn)程可能會:l阻塞阻塞(如果其所有子進(jìn)程都還在運(yùn)行)。 l帶子進(jìn)程的終止?fàn)顟B(tài)立即返回(如果一個子進(jìn)程已終止,正等待父進(jìn)程存取其終止?fàn)顟B(tài))。l出錯立即返回(如果它沒有任何子進(jìn)程)。n控制終端l
28、如果一個對話期有一個控制終端,則它有一個前臺進(jìn)程組,其他進(jìn)程組則為后臺進(jìn)程組。l 無論何時鍵入中斷鍵(常常是D E L E T E或C t r l - C)或退出鍵(常常是C t r l - ),就會造成將中斷信號或退出信號送至前臺進(jìn)程組的所有進(jìn)程送至前臺進(jìn)程組的所有進(jìn)程。l 如果終端界面檢測到調(diào)制解調(diào)器已經(jīng)脫開連接,則將掛斷信號送至控制進(jìn)程(對話期首進(jìn)程。)信號n信號是軟件中斷。很多比較重要的應(yīng)用程序都需處理信號。信號提供了一種處理異步事件的方法:終端用戶鍵入中斷鍵,則會通過信號機(jī)構(gòu)停止一個程序。n每個信號都有一個名字。這些名字都以三個字符S I G開頭。nsignumber.h - Sig
29、nal number definitions. Linux version.#define SIGHUP 1 /* Hangup (POSIX). */#define SIGINT 2 /* Interrupt (ANSI). */#define SIGQUIT 3 /* Quit (POSIX). */#define SIGILL 4 /* Illegal instruction (ANSI). */#define SIGTRAP 5 /* Trace trap (POSIX). */#define SIGABRT 6 /* Abort (ANSI). */#define SIGIOT 6
30、/* IOT trap (4.2 BSD). */#define SIGBUS 7 /* BUS error (4.2 BSD). */#define SIGFPE 8 /* Floating-point exception (ANSI). */#define SIGKILL 9 /* Kill, unblockable (POSIX). */#define SIGUSR1 10 /* User-defined signal 1 (POSIX). */#define SIGSEGV 11 /* Segmentation violation (ANSI). */#define SIGUSR2 1
31、2 /* User-defined signal 2 (POSIX). */n很多條件可以產(chǎn)生一個信號。l 當(dāng)用戶按某些終端鍵時,產(chǎn)生信號。在終端上按D E L E T E鍵通常產(chǎn)生中斷信號(S I G I N T)。l 硬件異常產(chǎn)生信號:除數(shù)為0、無效的存儲訪問等等。這些條件通常由硬件檢測到,并將其通知內(nèi)核。然后內(nèi)核為該條件發(fā)生時正在運(yùn)行的進(jìn)程產(chǎn)生適當(dāng)?shù)男盘?。例如,對?zhí)行一個無效存儲訪問的進(jìn)程產(chǎn)生一個S I G S E G V。l 進(jìn)程用k i l l ( 2 )函數(shù)可將信號發(fā)送給另一個進(jìn)程或進(jìn)程組。自然,有些限制:接收信號進(jìn)程和發(fā)送信號進(jìn)程的所有者必須相同,或發(fā)送信號進(jìn)程的所有者必須是超級
32、用戶。l 用戶可用k i l l ( 1 )命令將信號發(fā)送給其他進(jìn)程。此程序是k i l l函數(shù)的界面。常用此命令終止一個失控的后臺進(jìn)程。n信號是異步事件異步事件的經(jīng)典實例。產(chǎn)生信號的事件對進(jìn)程而言是隨機(jī)出現(xiàn)的。進(jìn)程不能只是測試一個變量(例如e r r n o )來判別是否發(fā)生了一個信號,而是必須告訴內(nèi)核“在此信號發(fā)生時,請執(zhí)行下列操作在此信號發(fā)生時,請執(zhí)行下列操作”。- 捕捉信號。為了做到這一點要通知內(nèi)核在某種信號發(fā)生時,調(diào)用一個用戶函數(shù)。在用戶函數(shù)中,可執(zhí)行用戶希望對這種事件進(jìn)行的處理。 #include typedef void (*sighandler_t) (int); sighan
33、dler_t signal( int signum, sighandler_t handler);nk i l l函數(shù)將信號發(fā)送給進(jìn)程或進(jìn)程組。#include #include int kill (pid_t p i d, int s i g n o) ; p i d 0 將信號發(fā)送給進(jìn)程I D為p i d的進(jìn)程。 p i d = 0 將信號發(fā)送給其進(jìn)程組I D等于發(fā)送進(jìn)程的進(jìn)程組I D,而且發(fā)送進(jìn)程有許可權(quán)向其發(fā)送信號的所有進(jìn)程。 pid 0 將信號發(fā)送給其進(jìn)程組I D等于p i d絕對值,而且發(fā)送進(jìn)程有許可權(quán)向其發(fā)送信號的所有進(jìn)程。np a u s e函數(shù)使調(diào)用進(jìn)程掛起直至捕捉到一個信號
34、。#include int pause(void);nsleep函數(shù)#include unsigned int sleep (unsigned int seconds) ;此函數(shù)使調(diào)用進(jìn)程被掛起直到:(1) 已經(jīng)過了s e c o n d s所指定的墻上時鐘時間,或者(2) 該進(jìn)程捕捉到一個信號并從信號處理程序返回。(提早返回)n實驗1 示例程序見 實驗二實驗二 模擬進(jìn)程調(diào)度算法模擬進(jìn)程調(diào)度算法n內(nèi)容:實現(xiàn)教材中所描述的短進(jìn)程優(yōu)先調(diào)度算法(SPF)和時間片輪轉(zhuǎn)調(diào)度算法(RR)。n要求:l進(jìn)程通過定義一個進(jìn)程控制塊的數(shù)據(jù)結(jié)構(gòu)(PCB)來表示;l每個進(jìn)程需要賦予進(jìn)程ID、進(jìn)程到達(dá)時間、進(jìn)程需要運(yùn)行
35、的總時間的屬性;l在RR中,以1為時間片單位;l運(yùn)行時,輸入5個進(jìn)程序列,按照進(jìn)程的ID輸出其執(zhí)行序列。#define PNUM 20struct pcb int pid; int t_arrive; int t_need; ;/struct pcb procsPNUM;/隨機(jī)序列生成:srand( (unsigned)getpid() ); /初始化procsi.t_need= rand()%10; / 0.9 time unitn實驗三實驗三 多進(jìn)程(線程)實現(xiàn)快速排序多進(jìn)程(線程)實現(xiàn)快速排序l內(nèi)容:編多進(jìn)程及多線程程序?qū)崿F(xiàn)對10000個隨機(jī)數(shù)的快速排序算法。l要求:l產(chǎn)生10000個隨
36、機(jī)數(shù),編寫一個多進(jìn)程(線程)實現(xiàn)快速排序算法; 要求說明你的程序運(yùn)行的系統(tǒng)資源配置,給出測試結(jié)果并對測試程序和結(jié)果做出說明. 回答用多進(jìn)程實現(xiàn)和多線程實現(xiàn)體現(xiàn)了什么差異,產(chǎn)生的原因是什么?4實現(xiàn)提示: l每次數(shù)據(jù)分割后產(chǎn)生兩個新的進(jìn)程(線程)處理分割后的數(shù)據(jù);l每個進(jìn)程(線程)處理的數(shù)據(jù)小于500以后不再分割l內(nèi)存文件映射mmap()n快速排序:快速排序: void q_sort(int numbers, int left, int right) int pivot, l_hold, r_hold; l_hold = left; r_hold = right; pivot = numbersl
37、eft; while (left = pivot) & (left right) right-; if (left != right) numbersleft = numbersright; left+; while (numbersleft = pivot) & (left right) left+; if (left != right) numbersright = numbersleft; right-; numbersleft = pivot; pivot = left; left = l_hold; right = r_hold; if (left pivot) q_
38、sort(numbers, pivot+1, right);n創(chuàng)建一個線程 nint pthread_create(pthread_t * thread, const pthread_attr_t * attr,void * (*start_routine)(void *), void *arg);參數(shù)參數(shù):lthread - returns the thread id. (unsigned long int defined in bits/pthreadtypes.h)創(chuàng)建線程的IDlattr - Set to NULL if default thread attributes are used. attr指出線程創(chuàng)建時候的屬性,我們用NULL來表明使用缺省屬性lvoid * (*start_routine) - pointer to the function to be threaded. Function has a single argument: pointer to void. start_routine函數(shù)指針是線程創(chuàng)建成功後開始執(zhí)行的函數(shù)l*arg - pointer to argument of function. To pass multiple arguments, send a pointer to a
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《策略組態(tài)MCGS》課件
- 《品讀林黛玉》課件
- 《COS治療的指南》課件
- 2025年浙江貨運(yùn)從業(yè)資格證題目答案大全及解析
- 微課教學(xué)交流平臺的設(shè)計與構(gòu)建
- 年度合作成果回顧模板
- 咨詢項目半年匯報模板
- 小學(xué)音樂合唱教學(xué)中開展德育教學(xué)的方法研究
- 小區(qū)道路工程冬季施工方案
- 實施國學(xué)教育必要性的策略培養(yǎng)論文
- 2023版設(shè)備管理體系標(biāo)準(zhǔn)
- 《工程款糾紛》課件
- 中建地下管廊豎井及矩形頂管專項施工方案
- 第7課互聯(lián)網(wǎng)應(yīng)用協(xié)議 課件 2023-2024學(xué)年浙教版(2023)初中信息技術(shù)七年級上冊
- 關(guān)于新能源汽車的論文1500字
- 診所規(guī)章制度匯編全套
- 中國音樂學(xué)院音樂基礎(chǔ)知識(四級)(基本樂科)備考試題庫(含答案)
- 學(xué)校校長思政課講稿共五篇
- 有限公司事業(yè)合伙人管理辦法
- 演示文稿國庫集中支付總流程圖
- 空調(diào)維保服務(wù)項目質(zhì)量保障措施
評論
0/150
提交評論