Unix程序設計基礎課件_第1頁
Unix程序設計基礎課件_第2頁
Unix程序設計基礎課件_第3頁
Unix程序設計基礎課件_第4頁
Unix程序設計基礎課件_第5頁
已閱讀5頁,還剩43頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

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

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

7、;UNIX下最優美的函數。pid_t是一個unisigned int,是進程號對應的數據類型Unix程序設計基礎PPT課件進程創建 “fork”的意思就是一分為二,把當前進程復制出一個新的進程。當前的進程就是新進程的父進程,新進程稱為子進程。 fork把子進程ID返回給父進程,把0返回給子進程,通過對返回值的檢查就可知道當前是父進程還是子進程。看看下面的例子就明白我在說什么。Unix程序設計基礎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程序設計基礎PPT課件進程創建n一般結構: if (pid = fork() 0)parents code; else if (pid = 0)childs code; elseerror handling;

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

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

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

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

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

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

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

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

17、action *act, struct sigaction *oact); signal函數的聲明有點復雜,解釋一下怎么看這數據的定義與聲明。Unix程序設計基礎PPT課件設置信號動作系統調用 從數據的名字開始,在這里是signal,向右看,是”(“,說明它是一個函數,括號內為參數列表;再向左看,是一個”*”,說明它的返回值是一個指針;再向右看,看到”(“,說明該指針指向一個函數,括號內為參數表。再向左看這個函數的返回值,是void。結束。基本方法就是右左右左 再來一個復雜點的。Unix程序設計基礎PPT課件設置信號動作系統調用typedef int (*(*(*fp)(void *)10)

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

19、。func可以是SIG_DEL,SIG_IGN,分別表示默認動作與忽略,也可以是自定義的參數表(int),返回值int的函數。signal成功返回原來的信號處理函數,失敗返回SIG_ERR。看下面例子。Unix程序設計基礎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程序設計基礎PPT課件設置信號動作系統調用n上面的程序雖然很短但卻引出來很多問題。先解釋一下幾個系統調用。 設置定時器alarm,函數原型: #include unsigned int alarm(unsigned int seconds); 在seconds秒后對本進程發送一個SIGALRM信號。一般情況下返回0;如果已經有一個定時器被設置且還沒有到時間,否返回上一個定時器剩余的時間。Unix程序設計基礎PPT課件設置信號動作系統調用 示例中的另一個調用pause,以及一個相似的庫函數slee

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

22、礎PPT課件不可重入函數n為什么不在SIGALRM的handler(即函數sig_alrm)里調用printf? 這就引出了不可重入函數的概念。不可重入函數是指這樣的一類函數,不可以在它還沒有返回就再次被調用。例如printf,malloc,free等都是不可重入函數。因為信號可能在任何時候發生,例如在printf執行過程中,因此不能在信號處理函數里調用printf,否則printf將會被重入。Unix程序設計基礎PPT課件不可重入函數n函數不可重入大多數是因為在函數中引用了全局變量。例如,printf會引用全局變量stdout,malloc,free會引用全局的內存分配表。仔細體會不難發現這

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

24、紹n高級I/On其它我認為有趣的 Thanks!Unix程序設計基礎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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論