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

下載本文檔

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

文檔簡介

1、Unix程序設(shè)計基礎(chǔ)PPT課件Unix程序設(shè)計基礎(chǔ) 第二講Unix程序設(shè)計基礎(chǔ)PPT課件上一講回顧n80386 CPU介紹n實(shí)模式與保護(hù)模式n特權(quán)級別n分段與分頁n系統(tǒng)調(diào)用原理n軟中斷引起特權(quán)級別的切換nint 80hn被封裝成一組C函數(shù)Unix程序設(shè)計基礎(chǔ)PPT課件上一講回顧nUnix下對文件與設(shè)備的操作n文件描述字n設(shè)備文件n文件操作系統(tǒng)調(diào)用n打開,創(chuàng)建,關(guān)閉文件n文件訪問權(quán)限n讀寫文件n文件定位Unix程序設(shè)計基礎(chǔ)PPT課件操作系統(tǒng)的重要概念:進(jìn)程n什么是進(jìn)程?nUnix下的進(jìn)程nUnix下的多進(jìn)程編程n進(jìn)程控制n信號處理n進(jìn)程間通信n特殊的進(jìn)程:線程Unix程序設(shè)計基礎(chǔ)PPT課件什么是

2、進(jìn)程?幾個定義:nAPUE: An executing instance of a program is called a process.n不準(zhǔn)確:程序一次運(yùn)行可以創(chuàng)建多個進(jìn)程n實(shí)質(zhì)上根本不對:在Unix下程序的運(yùn)行并不產(chǎn)生一個新進(jìn)程n我的定義:進(jìn)程是具有獨(dú)立地址空間的運(yùn)行單位Unix程序設(shè)計基礎(chǔ)PPT課件“獨(dú)立地址空間”很重要nUnix使用flat address,以32位系統(tǒng)為例,地址范圍從0 x0-0 xffffffff。任何地址都是虛擬地址,要通過頁面映射才能得到物理地址,這個過程對進(jìn)程來說是透明的,進(jìn)程看到的都是虛擬地址。n“獨(dú)立地址空間”是指各個進(jìn)程都有自己的虛擬地址空間(在Li

3、nux下為0 x0-0 xbfffffff),而且任何進(jìn)程都只能訪問到自已經(jīng)的虛擬地址空間。Unix程序設(shè)計基礎(chǔ)PPT課件進(jìn)程的并發(fā)性n宏觀上,所有進(jìn)程都是并發(fā)運(yùn)行的。n微觀上,除非是多處理器,否則不可能有兩個進(jìn)程在同時運(yùn)行。具體方法是時間片輪轉(zhuǎn):一個進(jìn)程運(yùn)行一個時間片,就把CPU讓出來讓另一個進(jìn)程運(yùn)行。因?yàn)闀r間片很小,所以用戶看起來所有進(jìn)程都在運(yùn)行。n任何兩個不相關(guān)的進(jìn)程其推進(jìn)速度可能是任意的。Unix程序設(shè)計基礎(chǔ)PPT課件并發(fā)帶來的好處與挑戰(zhàn)n很明顯好處:可以讓多個用戶分享CPU。對單用戶而言,也可同時運(yùn)行多個程序,如一邊上網(wǎng)一邊QQ。n更深層次的好處:充分利用CPU資源。n當(dāng)一個進(jìn)程在等

4、待數(shù)據(jù)時(從網(wǎng)絡(luò),外部設(shè)備等),其它進(jìn)程可占用CPU。Unix程序設(shè)計基礎(chǔ)PPT課件并發(fā)帶來的好處與挑戰(zhàn)n挑戰(zhàn):并不是所有的事情都可以同時做。n兩個進(jìn)程同時寫一個文件,對于普通文件,文件某一個位置上的內(nèi)容是最后一次寫入的結(jié)果。好像還不太糟。n但如果這個文件是一臺打印機(jī)那將會怎么樣?可以想像打印出來的東西將不是任何一個進(jìn)程想得到的。n數(shù)據(jù)的不一致性。Unix程序設(shè)計基礎(chǔ)PPT課件數(shù)據(jù)的不一致性n例:多個進(jìn)程通過共享內(nèi)存通信(一種進(jìn)程間通信方式,與地址空間獨(dú)立性無關(guān)),共享一塊物理地址。每個進(jìn)程都通過int *p映射到這塊物理地址。進(jìn)程每次獲取一個網(wǎng)頁,調(diào)用*p=*p1。最后*p的值就是多個進(jìn)程獲

5、取到的網(wǎng)頁總合。Unix程序設(shè)計基礎(chǔ)PPT課件數(shù)據(jù)的不一致性n進(jìn)程1nmov eax, pninc eaxnmov p, eaxn進(jìn)程2nmov eax, pninc eaxnmov p, eax結(jié)果不是我們想要的,*p只被加了1!Unix程序設(shè)計基礎(chǔ)PPT課件數(shù)據(jù)的不一致性n因?yàn)?p是共享資源,因此對它寫操作應(yīng)該是互斥的。訪問文件也是類似。n在編寫多進(jìn)程或多線程程序時應(yīng)當(dāng)特別注意。Unix程序設(shè)計基礎(chǔ)PPT課件Unix下的進(jìn)程n五種基本狀態(tài)n新建進(jìn)程正在被創(chuàng)建n就緒進(jìn)程正在等待被調(diào)度n運(yùn)行進(jìn)程正占用CPUn睡眠(阻塞)進(jìn)程正在等待一個事件,例如I/On僵死進(jìn)程已經(jīng)結(jié)束,正在等待釋放資源$ p

6、s guax查看系統(tǒng)中的所有進(jìn)程的詳細(xì)情況Unix程序設(shè)計基礎(chǔ)PPT課件狀態(tài)之間的轉(zhuǎn)換Unix程序設(shè)計基礎(chǔ)PPT課件進(jìn)程ID與進(jìn)程間的關(guān)系nUNIX系統(tǒng)中所有進(jìn)程都有一個唯一的,稱為進(jìn)程標(biāo)識的正整數(shù)與之相聯(lián),稱為進(jìn)程ID,簡稱PID。n除了init進(jìn)程(PID=1,所有進(jìn)程的祖先),任一進(jìn)程都有唯一的父進(jìn)程。n若干進(jìn)程可以屬于一個進(jìn)程組,進(jìn)程組也有一個唯一進(jìn)程組ID。Unix程序設(shè)計基礎(chǔ)PPT課件Unix下的多進(jìn)程編程 分三個部分1、進(jìn)程控制2、信號處理3、進(jìn)程間通信(IPC)Unix程序設(shè)計基礎(chǔ)PPT課件進(jìn)程控制n進(jìn)程創(chuàng)建fork 函數(shù)原型:#include pid_t fork(void)

7、;UNIX下最優(yōu)美的函數(shù)。pid_t是一個unisigned int,是進(jìn)程號對應(yīng)的數(shù)據(jù)類型Unix程序設(shè)計基礎(chǔ)PPT課件進(jìn)程創(chuàng)建 “fork”的意思就是一分為二,把當(dāng)前進(jìn)程復(fù)制出一個新的進(jìn)程。當(dāng)前的進(jìn)程就是新進(jìn)程的父進(jìn)程,新進(jìn)程稱為子進(jìn)程。 fork把子進(jìn)程ID返回給父進(jìn)程,把0返回給子進(jìn)程,通過對返回值的檢查就可知道當(dāng)前是父進(jìn)程還是子進(jìn)程??纯聪旅娴睦泳兔靼孜以谡f什么。Unix程序設(shè)計基礎(chǔ)PPT課件#include #include #include int main(void) pid_t pid; if (pid = fork() 0) printf(“I am the parent

8、, my pid = %u, my childs pid = %un”, getpid(), pid); else if (pid = 0) printf(“I am the child, my pid = %u, my parents pid = %un”, getpid(), getppid(); else perror(“fork”); return 1; return 0;Unix程序設(shè)計基礎(chǔ)PPT課件進(jìn)程創(chuàng)建n一般結(jié)構(gòu): if (pid = fork() 0)parents code; else if (pid = 0)childs code; elseerror handling;

9、n父進(jìn)程打開的文件描述字將被子進(jìn)程繼承。Unix程序設(shè)計基礎(chǔ)PPT課件進(jìn)程創(chuàng)建n獲得當(dāng)前進(jìn)程id: getpid獲得父進(jìn)程id: getppid函數(shù)原型:#include pid_t getpid(void);pid_t getppid(void);Unix程序設(shè)計基礎(chǔ)PPT課件執(zhí)行一個新程序n執(zhí)行程序系統(tǒng)調(diào)用execve函數(shù)原型:#include int execve(const char *path, const char *argv, const char *envp);Unix還提供其它幾個執(zhí)行程序函數(shù),execl,execlp,execle,execv,execvp都不是系統(tǒng)調(diào)用,依

10、賴于execve。Unix程序設(shè)計基礎(chǔ)PPT課件執(zhí)行一個新程序npath,執(zhí)行的文件nargv,參數(shù)表nenvp,環(huán)境變量表,一般直接用environ就行如:char *argv = “gcc”, “-g”, “-c”, “rbtree.c”, NULL;execve(“/usr/bin/gcc”, argv, environ);Unix程序設(shè)計基礎(chǔ)PPT課件執(zhí)行一個新程序 execve啟動一個新的程序,新的地址空間完全覆蓋當(dāng)前進(jìn)程的地址空間,但當(dāng)前進(jìn)程把開的文件描述字(除非特別設(shè)置),當(dāng)前工作目錄等將被繼承。 execve只返回負(fù)值表示調(diào)用失敗,如果成功的話將永不返回。Unix程序設(shè)計基礎(chǔ)P

11、PT課件shell執(zhí)行程序的原理 敲入命令: $ ps shell進(jìn)程到底做了什么事? 1、等待用戶輸入 (等待I/O,睡眠狀態(tài)) 2、獲得輸入ps 3、fork();子進(jìn)程把自己放到前臺,并調(diào)用execve(“ps”, );父進(jìn)程把子進(jìn)程放入前臺,并等待子進(jìn)程結(jié)束(父進(jìn)程進(jìn)入睡眠狀態(tài) ) 4、子進(jìn)程結(jié)束,父進(jìn)程得到子進(jìn)程的結(jié)束狀態(tài)信息,并把自己放到前臺,回到1。Unix程序設(shè)計基礎(chǔ)PPT課件shell執(zhí)行程序的原理n由此可以看出,進(jìn)程被創(chuàng)建的原因是因?yàn)閒ork被調(diào)用,而execve只是把當(dāng)前進(jìn)前的地址空間替換成新程序的地址空間。因此,不能說“進(jìn)程是程序的一次執(zhí)行”,“程序的執(zhí)行”只是地址空間

12、的替換。n思考: 在3中為什么既要父進(jìn)程把子進(jìn)程放到前臺,又要子進(jìn)程把自己放到前臺?n有興趣的話可以自己編寫一個shell。Unix程序設(shè)計基礎(chǔ)PPT課件等待進(jìn)程完成n子進(jìn)程運(yùn)行結(jié)束后(正?;虍惓#?,它并沒有馬上從系統(tǒng)的進(jìn)程分配表中被刪掉,而是進(jìn)入僵死狀態(tài)(Zombie),一直等到父進(jìn)程來回收它的結(jié)束狀態(tài)信息。n如果父進(jìn)程沒有回收走子進(jìn)程的結(jié)束狀態(tài)就已經(jīng)退出,子進(jìn)程將永遠(yuǎn)處于僵死狀態(tài);也有例外,如父進(jìn)程先于子進(jìn)程結(jié)束,子進(jìn)程將被init進(jìn)程繼承,并回init進(jìn)程回收其結(jié)束狀態(tài)信息。Unix程序設(shè)計基礎(chǔ)PPT課件等待進(jìn)程完成n回收子進(jìn)程結(jié)束狀態(tài)信息wait, waitpid 函數(shù)原型:#incl

13、ude pid_t wait(int *stat_loc);pid_t waitpid(pid_t pid, int *stat_loc, int options);Unix程序設(shè)計基礎(chǔ)PPT課件等待進(jìn)程完成 當(dāng)進(jìn)程調(diào)wait,它將進(jìn)入睡眠狀直到有一個子進(jìn)程結(jié)束。wait函數(shù)返回子進(jìn)程的進(jìn)程id,stat_loc中返回子進(jìn)程的退出狀態(tài)。 waitpid的第一個參數(shù)pid的意義: pid 0: 等待進(jìn)程id為pid的子進(jìn)程。 pid = 0: 等待與自己同組的任意子進(jìn)程。 pid = -1: 等待任意一個子進(jìn)程 pid 0) parents code; wait(); else if (pid

14、= 0) childs code;else error handling;return xxx;Unix程序設(shè)計基礎(chǔ)PPT課件信號處理n概念:信號是Unix操作系統(tǒng)用來通知進(jìn)程發(fā)生了某種事件的一種手段。nUnix程序設(shè)計教程:信號也稱為軟中斷。n注意與上節(jié)課中講的軟中斷區(qū)分。n事件的種類包括:程序錯誤類,程序中止類,鬧鐘類,I/O類,作業(yè)控制類,操作錯誤類,其它n在/usr/include/asm/signal.h中列出所有的信號名(SIGxxx)。Unix程序設(shè)計基礎(chǔ)PPT課件信號處理n當(dāng)進(jìn)程接收到一個信號(可能是自己發(fā)出,也可能是別的有權(quán)限的進(jìn)程發(fā)出),它可以采取的動作可以是下面任意一種:

15、n忽略信號:SIGSTOP與SIGKILL除外。n捕獲信號:當(dāng)信號出現(xiàn)時調(diào)用專門提供的一個函數(shù),這個函數(shù)稱為信號號柄。SIGSTOP與SIGKILL除外。n執(zhí)行信號的默認(rèn)動作。Unix程序設(shè)計基礎(chǔ)PPT課件幾個常見的信號nSIGINT: 前臺程序執(zhí)行過程中按下Ctrl-c就會向它發(fā)出SIGINT信號,默認(rèn)動作終止進(jìn)程。nSIGKILL: 立即中止進(jìn)程,不能被捕獲或忽略。nSIGTERM: kill命令默認(rèn)的中止程序信號。nSIGQUIT: Ctrl-發(fā)出的信號,默認(rèn)動作終止進(jìn)程并生成core文件。nSIGALRM: 定時器到期,可用alarm函數(shù)來設(shè)置定時器。默認(rèn)動作終止進(jìn)程。Unix程序設(shè)計

16、基礎(chǔ)PPT課件幾個常見的信號nSIGCHLD: 子進(jìn)程終止或停止,默認(rèn)動作為忽略。nSIGSTOP: 停止進(jìn)程。不可忽略或捕獲。nSIGCONT: 繼續(xù)被停止進(jìn)程。不可忽略。nSIGTSTP: Ctrl-z向程序發(fā)出的停止信號。nSIGUSR1、SIGUSR2: 程序可利用信號。默認(rèn)動作終止進(jìn)程。Unix程序設(shè)計基礎(chǔ)PPT課件設(shè)置信號動作系統(tǒng)調(diào)用n設(shè)置信號動作signal,sigaction。 函數(shù)原型: #include void (*signal(int sig, void (*func)(int)(int); int sigaction(int sig, const struct sig

17、action *act, struct sigaction *oact); signal函數(shù)的聲明有點(diǎn)復(fù)雜,解釋一下怎么看這數(shù)據(jù)的定義與聲明。Unix程序設(shè)計基礎(chǔ)PPT課件設(shè)置信號動作系統(tǒng)調(diào)用 從數(shù)據(jù)的名字開始,在這里是signal,向右看,是”(“,說明它是一個函數(shù),括號內(nèi)為參數(shù)列表;再向左看,是一個”*”,說明它的返回值是一個指針;再向右看,看到”(“,說明該指針指向一個函數(shù),括號內(nèi)為參數(shù)表。再向左看這個函數(shù)的返回值,是void。結(jié)束?;痉椒ň褪怯易笥易?再來一個復(fù)雜點(diǎn)的。Unix程序設(shè)計基礎(chǔ)PPT課件設(shè)置信號動作系統(tǒng)調(diào)用typedef int (*(*(*fp)(void *)10)

18、(int);定義fp為一個指針類型,指一個函數(shù),其返參數(shù)表是(void *),返回一個指向數(shù)組的指針,數(shù)組有10個元素,元素類型是一個指針,指向一個函數(shù),其參數(shù)列表為(int ),返回值是int。Has a try: 聲明一個數(shù)組,包括10個元素,每個元素是一個指針,指向一個函數(shù),其參數(shù)列表為(int),返回值是指針,指向一個有10個元素的數(shù)組,元素類型是指針,指向另一個指針,這個指針指向fp型(上面定義好的那個)。Unix程序設(shè)計基礎(chǔ)PPT課件設(shè)置信號動作系統(tǒng)調(diào)用n繼續(xù)講signal函數(shù)。第一個參數(shù)sig是要設(shè)定動作的信號名,如SIGALRM,第二個參數(shù)func是接收到這個信號是要執(zhí)行的動作

19、。func可以是SIG_DEL,SIG_IGN,分別表示默認(rèn)動作與忽略,也可以是自定義的參數(shù)表(int),返回值int的函數(shù)。signal成功返回原來的信號處理函數(shù),失敗返回SIG_ERR。看下面例子。Unix程序設(shè)計基礎(chǔ)PPT課件#include #include static int flag = 0;static void sig_alrm(int signo) flag = 1;int main(void) if (signal(SIGALRM, sig_alrm) = SIG_ERR) perror(“signal”); exit(1); alarm(10); pause(); if

20、 (flag) printf(“SIGALRM receivedn”); return 0;Unix程序設(shè)計基礎(chǔ)PPT課件設(shè)置信號動作系統(tǒng)調(diào)用n上面的程序雖然很短但卻引出來很多問題。先解釋一下幾個系統(tǒng)調(diào)用。 設(shè)置定時器alarm,函數(shù)原型: #include unsigned int alarm(unsigned int seconds); 在seconds秒后對本進(jìn)程發(fā)送一個SIGALRM信號。一般情況下返回0;如果已經(jīng)有一個定時器被設(shè)置且還沒有到時間,否返回上一個定時器剩余的時間。Unix程序設(shè)計基礎(chǔ)PPT課件設(shè)置信號動作系統(tǒng)調(diào)用 示例中的另一個調(diào)用pause,以及一個相似的庫函數(shù)slee

21、p #include int pause(void); int sleep(unsigned int seconds); sleep讓進(jìn)程睡眠seconds秒,pause讓進(jìn)程永遠(yuǎn)睡眠。如果在睡眠過程中被信號打斷,它們將返回-1。Unix程序設(shè)計基礎(chǔ)PPT課件設(shè)置信號動作系統(tǒng)調(diào)用 例子中的兩個語句: alarm(10); pause(); 的意義就是暫停10秒。10秒后pause()被SIGALRM打斷,返回-1,進(jìn)程繼續(xù)運(yùn)行。信號SIGALRM的handler把flags設(shè)為1并且返回,于是main知道是被SIGALRM信號中斷,打印出”SIGALRM received”。Unix程序設(shè)計基

22、礎(chǔ)PPT課件不可重入函數(shù)n為什么不在SIGALRM的handler(即函數(shù)sig_alrm)里調(diào)用printf? 這就引出了不可重入函數(shù)的概念。不可重入函數(shù)是指這樣的一類函數(shù),不可以在它還沒有返回就再次被調(diào)用。例如printf,malloc,free等都是不可重入函數(shù)。因?yàn)樾盘柨赡茉谌魏螘r候發(fā)生,例如在printf執(zhí)行過程中,因此不能在信號處理函數(shù)里調(diào)用printf,否則printf將會被重入。Unix程序設(shè)計基礎(chǔ)PPT課件不可重入函數(shù)n函數(shù)不可重入大多數(shù)是因?yàn)樵诤瘮?shù)中引用了全局變量。例如,printf會引用全局變量stdout,malloc,free會引用全局的內(nèi)存分配表。仔細(xì)體會不難發(fā)現(xiàn)這

23、與前面說到多進(jìn)程下的數(shù)據(jù)不一致性很相似,都是對共享數(shù)據(jù)的相斥訪問問題。Unix程序設(shè)計基礎(chǔ)PPT課件這個例子是否存在問題? alarm(10); pause(); 前面說到,進(jìn)程的推進(jìn)速度可能是任意的,如果執(zhí)行完alarm,進(jìn)程的時間片正好用完;過了十幾秒之后才又輪到這個進(jìn)程運(yùn)行,會怎么樣? 結(jié)果是,pause在接收到信號之后才被調(diào)用。也就是說sig_alrm執(zhí)行完返回pause()才被調(diào)用,結(jié)果是進(jìn)程永久的睡眠(除非它再收到別的信號)。 雖然這種情況幾乎不可能發(fā)生,但我們還是應(yīng)該避免這種潛在的錯誤。Unix程序設(shè)計基礎(chǔ)PPT課件下次課的內(nèi)容n信號處理(續(xù))n進(jìn)程間通信(IPC)n線程的簡單介

24、紹n高級I/On其它我認(rèn)為有趣的 Thanks!Unix程序設(shè)計基礎(chǔ)PPT課件%r#oXlTiQeNbK8G5D2A-x*t$qZnVkShPdMaI7F4C0z)w&s!pYmUjRfOcL9H6E3B+y(u%r#oWlTiQeNbJ8G5D1A-x*t$qYnVkSgPdMaI7F3C0z)v&s!pXmUiRfOcK9H6E2B+x(u%rZoWlThQeNbJ8G4D1A-w*t$qYnVjSgPdLaI7F3C0y)v&s#pXmUiRfNcK9H5E2B+x(u$rZoWkThQeMbJ7G4D1z-w*t!qYmVjSgOdLaI6F3B0y)v%s#p

25、XlUiRfNcK8H5E2A+x(u$rZnWkThPeMbJ7G4C1z-w&t!qYmVjRgOdL9I6F3B0y(v%s#oXlUiQfNbK8H5D2A+x*u$qZnWkShPeMaJ7G4C1z)w&t!pYmVjRgOcL9I6E3B0y(v%r#oXlTiQfNbK8G5D2A-x*u$qZnVkShPdMaJ7F4C0z)w&s!pYmUjRfOcL9H6E3B+y(v%r#oWlTiQeNbK8G5D1A-x*t$qZnVkSgPdMaI7F4C0z)v&s!pXmUjRfOcK9H6E2B+y(u%rZoWlThQeNbJ8G4D1A-

26、w*t$qYnVjSgPdLaI7F3C0z)v&s#pXmUiRfOcK9H5E2B+x(u%rZoWkThQeMbJ8G4D1z-w*t!qYnVjSgOdLaI6F3C0y)v%s#pXlUiRfNcK8H5E2A+x(u$rZoWkThPeMbJ7G4D1z-w&t!qYmVjSgOdL9I6F3B0y)v%s#oXlUiQfNcK8H5D2A+x*u$rZnWkShPeMaJ7G4C1z)w&t!pYmVjRgOdL9I6E3B0y(v%s#oXlTiQfNbK8H5D2A-x*u$qZnWkShPdMaJ7F4C1z)w&s!pYmUjRgOcL9H

27、6E3B+y(v%r#oWlTiQeNbK8G5D1A-x*t$qZnVkShPdMaI7F4C0z)w&s!pXmUjRfOcL9H6E2B+y(u%r#oWlThQeNbJ8G5D1A-w*t$qYnVkSgPdLaI7F3C0z)v&s#pXmUiRfOcK9H6E2B+x(u%rZoWlThQeMbJ8J8G4D1A-w*t!qYnVjSgPdLaI6F3C0y)v&s#pXlUiRfNcK9H5E2A+x(u$rZoWkThPeMbJ7G4D1z-w&t!qYmVjSgOdL9I6F3B0y)v%s#pXlUiQfNcK8H5E2A+x*u$rZnWk

28、ThPeMaJ7G4C1z-w&t!pYmVjRgOdL9I6E3B0y(v%s#oXlTiQfNbK8H5D2A-x*u$qZnWkShPeMaJ7F4C1z)w&t!pYmUjRgOcL9I6E3B+y(v%r#oXlTiQeNbK8G5D2A-x*t$qZnVkShPdMaI7F4C0z)w&s!pXmUjRfOcL9H6E2B+y(u%r#oWlTiQeNbJ8G5D1A-x*t$qYnVkSgPdMaI7F3C0z)v&s!pXmUiRfOcK9H6E2B+x(u%rZoWlThQeMbJ8G4D1A-w*t!qYnVjSgPdLaI7F3C0y)v&

29、amp;s#pXmUiRfNcK9H5E2B+x(u$rZoWkThQeMbJ7G4D1z-w*t!qYmVjSgOdLaI6F3B0y)v%s#pXlUiQfNcK8H5E2A+x(u$rZnWkThPeMbJ7G4C1z-w&t!qYmVjRgOdL9I6F3B0y(v%s#oXlUiQfNbK8H5D2A+x*u$qZnWkShPeMaJ7F4C1z)w&t!pYmUjRgOcL9I6E3B0y(v%r#oXlTiQfNbK8G5D2A-x*u$qZnVkShPdMaJ7F4C0z)w&s!pYmUjRfOcL9H6E3B+y(u%r#oWlTiQeNbJ8G5D

30、1A-x*t$qZnVkSgPdMaI7F4C0z)v&s!pXmUjRfOcK9H6E2B+y(u%rZoWlThQeNbJ8G4D1A-w*t$qYnVjSgPdLaI7F3C0y)v&s#pXmUiRfNcK9H5H5E2B+x(u$rZoWkThQeMbJ8G4D1z-w*t!qYnVjSgOdLaI6F3C0y)v%s#pXlUiRfNcK8H5E2A+x(u$rZnWkThPeMbJ7G4C1z-w&t!qYmVjRgOdL9I6F3B0y)v%s#oXlUiQfNcK8H5D2A+x*u$rZnWkShPeMaJ7G4C1z)w&t!pYmVjRg

31、OcL9I6E3B0y(v%r#oXlTiQfNbK8G5D2A-x*u$qZnVkShPdMaJ7F4C1z)w&s!pYmUjRgOcL9H6E3B+y(v%r#oWlTiQeNbK8G5D1A-x*t$qZnVkSgPdMaI7F4C0z)v&s!pXmUjRfOcK9H6E2B+y(u%r#oWlThQeNbJ8G5D1A-w*t$qYnVkSgPdLaI7F3C0z)v&s#pXmUiRfOcK9H5E2B+x(u%rZoWkThQeMbJ8G4D1z-w*t!qYnVjSgOdLaI6F3C0y)v&s#pXlUiRfNcK9H5E2A+x(u$rZ

32、oWkThPeMbJ7G4D1z-w&t!qYmVjSgOdL9I6F3B0y)v%s#oXlUiQfNcK8H5D2A+x*u$rZnWkThPeMaJ7G4C1z-w&t!pYmVjRgOdL9I6E3B3B0y(v%s#oXlTiQfNbK8H5D2A-x*u$qZnWkShPdMaJ7F4C1z)w&s!pYmUjRgOcL9H6E3B+y(v%r#oWlTiQeNbK8G5D2A-x*t$qZnVkShPdMaI7F4C0z)w&s!pXmUjRfOcL9H6E2B+y(u%r#oWlThQeNbJ8G5D1A-w*t$qYnVkSgPdLaI7F3C

33、0z)v&s!pXmUiRfOcK9H6E2B+x(u%rZoWlThQeMbJ8G4D1A-w*t!qYnVjSgPdLaI6F3C0y)v&s#pXlUiRfNcK9H5E2A+x(u$rZoWkThQeMbJ7G4D1z-w*t!qYmVjSgOdLaI6F3B0y)v%s#pXlUiQfNcK8H5E2A+x*u$rZnWkThPeMaJ7G4C1z-w&t!pYmVjRgOdL9I6E3B0y(v%s#oXlUiQfNbK8H5D2A+x*u$qZnWkShPeMaJ7F4C1z)w&t!pYmUjRgOcL9I6E3B+y(v%r#oXlTiQeNe

34、NbK8G5D2A-x*t$qZnVkShPdMaI7F4C0z)w&s!pXmUjRfOcL9H6E3B+y(u%r#oWlTiQeNbJ8G5D1A-x*t$qYnVkSgPdMaI7F3C0z)v&s!pXmUiRfOcK9H6E2B+x(u%rZoWlThQeMbJ8G4D1A-w*t$qYnVjSgPdLaI7F3C0y)v&s#pXmUiRfNcK9H5E2B+x(u$rZoWkThQeMbJ7G4D1z-w*t!qYmVjSgOdLaI6F3B0y)v%s#pXlUiRfNcK8H5E2A+x(u$rZnWkThPeMbJ7G4C1z-w&t!qY

35、mVjRgOdL9I6F3B0y(v%s#oXlUiQfNbK8H5D2A+x*u$qZnWkShPeMaJ7F4C1z)w&t!pYmVjRgOcL9I6E3B0y(v%r#oXlTiQfNbK8G5D2A-x*u$qZnVkShPdMaJ7F4C0z)w&s!pYmUjRfOcL9H6E3B+y(u%r#oWlTiQeNbK8G5D1A-x*t$qZnVkSgPdMaI7F4C0z)v&s!pXmUjRfOcK9H6E2B+y(u%rZoWlThQeNbJ8G4D1A-w*t$qYnVjSgPdLaI7F3C0y)v&s#pXmUiRfOcK9H5E2B+x

36、+x(u%rZoWkThQeMbJ8G4D1z-w*t!qYnVjSgOdLaI6F3C0y)v%s#pXlUiRfNcK8H5E2A+x(u$rZnWkThPeMbJ7G4C1z-w&t!qYmVjSgOdL9I6F3B0y)v%s#oXlUiQfNcK8H5D2A+x*u$rZnWkShPeMaJ7G4C1z)w&t!pYmVjRgOcL9I6E3B0y(v%r#oXlTiQfNbK8G5D2A-x*u$qZnWkShPdMaJ7F4C1z)w&s!pYmUjRgOcL9H6E3B+y(v%r#oWlTiQeNbK8G5D1A-x*t$qZnVkSgPdMaI7F4C0z)v&s!pXmUjRfOcL9H6E2B+y(u%r#oWlThQeNbJ8G5D1A-w*t$qYnVkSgPdLaI7I7F3C0z)v&s#pXmUiRfOcK9H5E2B+x(u%rZoWkThQeMbJ8G4D1z-w*t!qYnVjSgOdLaI6F3C0y)v&s#pXlUiRfNcK9H5E2A+x(u$rZoWkThPeMbJ7G4D1

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論