版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
嵌入式系統(tǒng)原理與應(yīng)用電子與電氣工程學(xué)院第四章進(jìn)程與線程教師:程蔚正大氣象厚德載物MinnanUniversityofScienceandTechnology進(jìn)程與線程CONTENTS01.進(jìn)程02.進(jìn)程間通信03.多線程正大氣象厚德載物MinnanUniversityofScienceandTechnology01PARTONE進(jìn)程正大氣象厚德載物MinnanUniversityofScienceandTechnology進(jìn)程簡介進(jìn)程創(chuàng)建和退出wait()和waitpid()
exec函數(shù)族進(jìn)程1、什么是進(jìn)程進(jìn)程是一個程序的執(zhí)行過程,是動態(tài)的,包括動態(tài)創(chuàng)建、調(diào)度、消亡整個過程。資源分配的最小單元。程序是靜態(tài)的,是一些保存在磁盤上的指令的有序集合,沒有任何執(zhí)行的概念。2、進(jìn)程的標(biāo)識進(jìn)程號(PID,ProcessIdentityNumber):進(jìn)程的標(biāo)識,獲取當(dāng)前進(jìn)程的PID的函數(shù)是getpid()。父進(jìn)程號(PPID,ParentProcessIdentityNumber),獲取父進(jìn)程號為getppid()。進(jìn)程簡介進(jìn)程簡介演示:process.c3、父進(jìn)程和子進(jìn)程進(jìn)程A創(chuàng)建進(jìn)程B,那進(jìn)程A就是進(jìn)程B的父進(jìn)程,進(jìn)程B是進(jìn)程A的子進(jìn)程。所有進(jìn)程都是由它的父進(jìn)程創(chuàng)建出來的,init是所有進(jìn)程的祖先。4、進(jìn)程如何被中止進(jìn)程的中止可以分為兩種:正常終止和異常中止正常終止: 1.main函數(shù)調(diào)用return返回,終止進(jìn)程。 2.庫函數(shù)exit終止進(jìn)程 3.系統(tǒng)調(diào)用_exit或者_(dá)Exit終止進(jìn)程。異常中止: 1.調(diào)用abort函數(shù)終止進(jìn)程 2.被信號終止進(jìn)程簡介5、進(jìn)程空間在Linux系統(tǒng)中,進(jìn)程的用戶空間是獨立的,相互不影響的;一個進(jìn)程不能讀取或者修改另一個進(jìn)程的數(shù)據(jù),只這樣提高了安全性和穩(wěn)定性。
新進(jìn)程被創(chuàng)建出來后,便是一個獨立的進(jìn)程,擁有自己獨立的進(jìn)程空間,擁有自己唯一的進(jìn)程號(PID)、擁有自己獨立的PCB(進(jìn)程控制塊),新進(jìn)程會被內(nèi)核同等調(diào)度執(zhí)行,參與到系統(tǒng)調(diào)用中。進(jìn)程簡介6、進(jìn)程的生命周期創(chuàng)建、就緒、運行(執(zhí)行)、等待(阻塞)、退出(終止或者結(jié)束)主要由進(jìn)程調(diào)度完成進(jìn)程狀態(tài)轉(zhuǎn)換進(jìn)程簡介進(jìn)程的創(chuàng)建和退出1、進(jìn)程的創(chuàng)建#include<unistd.h>pid_tfork(void)返回值:成功:0或者大于0的整數(shù)
失?。?1注意:當(dāng)一個進(jìn)程調(diào)用fork()成功后,fork()在父子兩個進(jìn)程中都會返回,父進(jìn)程返回值子進(jìn)程的PID;子進(jìn)程返回0。操作4.1:fork_sample.c進(jìn)程的創(chuàng)建和退出2、進(jìn)程的退出:exit和_exit函數(shù)exit和_exit都是C語言標(biāo)準(zhǔn)庫中的函數(shù),用于終止程序的執(zhí)行#include<stdlib.h>voidexit(intstatus);參數(shù):status進(jìn)程終止的狀態(tài),零這表示正常終止。
如果status為非零,這表示進(jìn)程異常終止。intatexit(void(*)(void));這個函數(shù)會注冊一個函數(shù),該函數(shù)會在程序正常終止時被調(diào)用。進(jìn)程的創(chuàng)建和退出2、進(jìn)程的退出exit和_exit函數(shù)exit和_exit都是C語言標(biāo)準(zhǔn)庫中的函數(shù),用于終止程序的執(zhí)行#include<unistd.h>void_exit(intstatus)參數(shù):status進(jìn)程終止的狀態(tài)。 _exit函數(shù)則立即終止程序,不會執(zhí)行任何清理操作,也不會關(guān)閉打開的流或釋放動態(tài)分配的內(nèi)存。exit函數(shù)最后會調(diào)用_exit函數(shù)來終止程序。進(jìn)程的創(chuàng)建和退出2、進(jìn)程的退出-
exit和_exit函數(shù)操作4.5:exit.c等待子進(jìn)程退出---wait()和waitpid()子進(jìn)程的狀態(tài)變化:1.子進(jìn)程終止2.子進(jìn)程因為收到停止信號而停止運行。(SIGSTOP、SIGSTP)3.子進(jìn)程在停止?fàn)顟B(tài)下因為收到恢復(fù)信號而恢復(fù)運行。(SIGCONT)父進(jìn)程監(jiān)視子進(jìn)程進(jìn)程退出時會關(guān)閉所有文件描述符,釋放在用戶空間分配的內(nèi)存,但是進(jìn)程控制塊PCB會暫時保留,里面存放退出狀態(tài)。比如一個進(jìn)程正常退出,進(jìn)程控制塊PCB里就存放進(jìn)程的退出狀態(tài)(退出碼);如果是異常退出,那么進(jìn)程控制塊PCB里存放導(dǎo)致該進(jìn)程終止的信號進(jìn)程等待等待子進(jìn)程退出---wait()和waitpid()1.確保時序問題:子進(jìn)程先退出,父進(jìn)程再退出2.資源回收,防止內(nèi)存泄露的問題進(jìn)程等待的必要性wait()函數(shù)waitpid()函數(shù)進(jìn)程等待的方式等待子進(jìn)程退出---wait()和waitpid()status:子進(jìn)程退出狀態(tài);pid:<-1
表示等待進(jìn)程組ID等于pid絕對值的任何子進(jìn)程。-1 表示等待任何子進(jìn)程。0 表示等待任何子進(jìn)程,其進(jìn)程組ID等于調(diào)用進(jìn)程的進(jìn)程組ID。
>0 表示等待子進(jìn)程ID等于pid的值。options:
WNOHANG
沒有子進(jìn)程退出立即返回(非阻塞等待)#include<sys/types.h>#include<sys/wait.h>pid_twait(int*status);pid_twaitpid(pid_tpid,int*status,intoptions);等待子進(jìn)程退出---wait()和waitpid()頭文件#include<sys/types.h>和<sys/wait.h>1.pid_twait(int*status)用于使父進(jìn)程阻塞,直到一個子進(jìn)程結(jié)束或該進(jìn)程接到了一個指定的信號為止。參數(shù):status用于存放子進(jìn)程終止時候的狀態(tài)信息返回值:成功返回終止的子進(jìn)程號。失敗返回-12.pid_twaitpid(pid_tpidint*status,intoption)等待指定pid的進(jìn)程,可以是非阻塞的。參數(shù):pid用于表示需要等待的某個具體的子進(jìn)程 status用于存放子進(jìn)程終止時候的狀態(tài)信息 option是一個選項標(biāo)志,用于控制waitpid()的行為。返回值:成功返回終止的子進(jìn)程號。失敗返回-1等待子進(jìn)程退出---wait()和waitpid()status:子進(jìn)程退出狀態(tài);WIFEXITED(status):子進(jìn)程正常退出,此宏為真WEXITSTATUS(status):子進(jìn)程正常退出,獲取子進(jìn)程的退出值WIFSIGNALED(status):子進(jìn)程被信號殺死,此宏為真WTERMSIG(status):子進(jìn)程被信號殺死,獲取導(dǎo)致子進(jìn)程死亡的信號WCOREDUMP(status):子進(jìn)程被信號殺死或生成核心存儲文件,此宏為真WIFSTOPPED(status):子進(jìn)程被信號暫停,options=WUNTRACED,此宏為真WSTOPSIG(status):WIFSTOPPED(status)為真,獲取導(dǎo)致子進(jìn)程暫停的信號值WIFCONTINUED(status):子進(jìn)程被SIGCONT重置,此宏為真等待子進(jìn)程退出---wait()和waitpid()操作4.3:wait.c操作4.4:waitpid.cexec函數(shù)族path和file:被加載的執(zhí)行的文件或腳本路徑;arg:列表形式的參數(shù);argv:數(shù)組形式的參數(shù);envp:用戶自定義的環(huán)境變量數(shù)組。#include<unistd.h>intexecl(constchar*path,constchar*arg,...);intexeclp(constchar*file,constchar*arg,...);intexecle(constchar*path,constchar*arg,...);intexecv(constchar*path,char*constargv[]);intexecvp(constchar*file,char*constargv[]);intexecvpe(constchar*file,char*constargv[],char*constenvp[]);exec函數(shù)族path和file:被加載的執(zhí)行的文件或腳本路徑;arg:列表形式的參數(shù);argv:數(shù)組形式的參數(shù);envp:用戶自定義的環(huán)境變量數(shù)組。l:參數(shù)以列表(list)的方式提供v:參數(shù)以矢量(vector)數(shù)組方式提供p:利用環(huán)境變量PATH來指定可執(zhí)行文件e:用戶提供自定義的環(huán)境變量(environment)exec函數(shù)族1.child.c寫一個main程序,傳入?yún)?shù)為字符串?dāng)?shù)組,將傳入的參數(shù)打印出來。編譯程序,生成二進(jìn)制可執(zhí)行文件child2.exec.c寫一個main函數(shù),調(diào)用fork()創(chuàng)建一個子進(jìn)程,在子進(jìn)程中調(diào)用execl函數(shù)去執(zhí)行另一個程序child。編譯驗證是否可以正常執(zhí)行child。操作4.2:exec.cchild.c1、fork()、wait()、waitpid()、exit()/_exit()、exec函數(shù)簇2、作業(yè)
編寫程序?qū)崿F(xiàn)生成5個子進(jìn)程。3、思政:
總結(jié)與作業(yè)THANKYOU!02PARTTWO進(jìn)程間通信正大氣象厚德載物MinnanUniversityofScienceandTechnology進(jìn)程間通信概述無名管道、有名管道通信消息隊列信號共享內(nèi)存信號量進(jìn)程間通信進(jìn)程間通信
每個進(jìn)程是操作系統(tǒng)中獨立的執(zhí)行體,彼此隔離,并具有自己的生命周期。為了合作完成指定任務(wù),進(jìn)程之間也需要進(jìn)行數(shù)據(jù)交互和同步。Linux系統(tǒng)通過不同方式實現(xiàn)進(jìn)程間通信和同步。不同的方式適用于不同的場合,用戶可根據(jù)實際需要選擇合適的進(jìn)程間通信和同步機制。進(jìn)程間的通信方式:管道通信、信號、內(nèi)存共享、消息隊列、信號量、套接字管道通信管道通信管道是Linux系統(tǒng)中進(jìn)程間的半雙工通信方式。如果進(jìn)程A和進(jìn)程B通過管道連接起來,那么數(shù)據(jù)就能夠通過管道由進(jìn)程A流向進(jìn)程B,或者由進(jìn)程B流向進(jìn)程A。管道是單向的、先進(jìn)先出的。管道通信的類型:無名管道:用于父進(jìn)程和子進(jìn)程間的通信有名管道:可用于運行于同一系統(tǒng)中的任意兩個進(jìn)程間的通信管道的創(chuàng)建所需頭文件#include<unistd.h>函數(shù)原型intpipe(intpipefd[2]);函數(shù)傳入值pipefd[2]:管道的兩個文件描述符,pipefd[0]用于管道的讀端,pipefd[1]用于管道的寫端。函數(shù)返回值成功:0失?。?1所需頭文件#include<sys/types.h>#include<sys/stat.h>函數(shù)原型intmkfifo(constchar*pathname,mode_tmode);函數(shù)傳入值pathname:要創(chuàng)建的管道,創(chuàng)建之前不能存在mode:管道的訪問權(quán)限,如0666函數(shù)返回值成功:0失?。?1無名管道有名管道管道通信管道的關(guān)閉關(guān)閉管道只需將這兩個文件描述符關(guān)閉即可,可以使用普通的close函數(shù)逐個關(guān)閉。操作4.6:pipe.c操作4.7:w_fifo.cr_fifo.c消息隊列管道只能傳輸無格式的字節(jié)流,會給應(yīng)用程序開發(fā)帶來不便,而消息隊列克服了此缺點。消息隊列就是一個消息的鏈表,可以把消息看作一個具有特定格式的記錄。進(jìn)程可以從消息隊列中添加消息,另一些進(jìn)程則可以從消息隊列中讀取消息。消息結(jié)構(gòu)體必須自己定義,但必須按照系統(tǒng)的要求定義,消息結(jié)構(gòu)體如下:structmsgbuf{ longmsgtype;//消息類型,必須是long型 charname[SIZE];//消息正文};消息隊列消息隊列1、鍵值系統(tǒng)建立IPC通信(消息隊列、信號量和共享內(nèi)存)時必須指定一個ID值,該值通過ftok()函數(shù)獲取所需頭文件#include<sys/types.h>#include<sys/ipc.h>函數(shù)原型key_tftok(constchar*pathname,intproj_id);函數(shù)傳入值pathname:文件名proj_id:項目名,不為0即可函數(shù)返回值成功:返回文件名對應(yīng)的鍵值失?。?1消息隊列2、打開/創(chuàng)建消息隊列所需頭文件#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>函數(shù)原型intmsgget(key_tkey,intmsgflg);函數(shù)傳入值key:消息隊列的鍵值,多個進(jìn)程可通過它訪問同一個消息隊列msgflg權(quán)限標(biāo)志位IPC_CREAT:創(chuàng)建IPC_EXCL:如果不存在則創(chuàng)建,否則返回錯誤IPC_NOWAIT:不阻塞函數(shù)返回值成功:返回消息隊列ID失?。?1消息隊列3、發(fā)送消息所需頭文件#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>函數(shù)原型intmsgsnd(intmsqid,constvoid*msgp,size_tmsgsz,intmsgflg);函數(shù)傳入值msqid:消息隊列的隊列IDmsgp:指向消息結(jié)構(gòu)的指針,消息結(jié)構(gòu)格式如前所述msgsz:消息正文的字節(jié)數(shù)msgflg發(fā)送標(biāo)志IPC_NOWAIT:若消息無法立即發(fā)送,函數(shù)立即返回,比如消息隊列已滿0:阻塞等待,直到發(fā)送成功為止函數(shù)返回值成功:0失?。?1消息隊列4、讀取消息所需頭文件#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>函數(shù)原型ssize_tmsgrcv(intmsqid,void*msgp,size_tmsgsz,longmsgtyp,intmsgflg);函數(shù)傳入值msqid:消息隊列的隊列IDmsgp:消息緩沖區(qū),將消息存放在消息結(jié)構(gòu)體中msgsz:消息正文的字節(jié)數(shù)msgtyp0:接受消息隊列中的第一個消息大于0:接受消息隊列中第一個類型為msgtyp的消息小于0:接受消息隊列中第一個類型值不小于msgtyp絕對值且類型值最小的消息msgflgMSG_NOERROR:返回的消息比msgsz多,消息被截短為msgsz字節(jié)且不通知消息發(fā)送進(jìn)程IPC_NOWAIT:消息隊列中沒有相應(yīng)類型的消息可以接收,立即返回0:阻塞直到接受一條相應(yīng)消息為止函數(shù)返回值成功:0失?。?1消息隊列5、消息控制所需頭文件#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>函數(shù)原型intmsgctl(intmsqid,intcmd,structmsqid_ds*buf);函數(shù)傳入值msqid:消息隊列的隊列IDcmdIPC_STAT:讀取消息隊列的數(shù)據(jù)結(jié)構(gòu)msgid_ds,并將其存儲在buf指定地址中IPC_SET:設(shè)置消息隊列的數(shù)據(jù)結(jié)構(gòu)msqid_ds中的ipc_perm域IPC_RMID:刪除msqid標(biāo)識的消息隊列buf描述消息隊列的msgid_ds結(jié)構(gòu)類型變量函數(shù)返回值成功:0失?。?1操作4.9:snd_msg.crcv_msg.c信號Linux的信號在軟件層面對硬件中斷進(jìn)行模擬。運行中的進(jìn)程會收到內(nèi)核或其他進(jìn)程發(fā)來的信號。接收到信號后,進(jìn)程根據(jù)預(yù)先設(shè)置的動作對信號進(jìn)行處理kill-l--->查看信號類型在Linux系統(tǒng)中,進(jìn)程對信號的響應(yīng)主要有三種形式:(1)忽略信號:進(jìn)程將忽略信號,不做任何響應(yīng),但對于信號SIGKILL和SIGSTOP,進(jìn)程不能夠忽略;(2)默認(rèn)動作:對于給定的信號采用系統(tǒng)默認(rèn)操作;
(3)捕捉信號:對于給定的信號預(yù)先設(shè)置信號處理函數(shù),收到信號后,進(jìn)程將執(zhí)行信號處理函數(shù)所需頭文件#include<signal.h>函數(shù)原型typedefvoid(*sighandler_t)(int);sighandler_tsignal(intsignum,sighandler_thandler);函數(shù)傳入值signum:要捕捉的信號handler
函數(shù)返回值成功:原來的信號處理函數(shù)指針失敗:-1操作4.12:signal.c信號信號共享內(nèi)存共享內(nèi)存是進(jìn)程間高效數(shù)據(jù)傳輸通信方式。進(jìn)程通過共享內(nèi)存實現(xiàn)數(shù)據(jù)通信,先將其映射到進(jìn)程地址空間,然后訪問該地址空間,進(jìn)行讀寫操作,就能夠?qū)崿F(xiàn)對共享內(nèi)存的讀寫。當(dāng)多個進(jìn)程對同一個共享內(nèi)存進(jìn)行操作時,為了保證數(shù)據(jù)的一致性,往往通過同步機制對其進(jìn)行保護(hù),比如互斥鎖或信號量。共享內(nèi)存共享內(nèi)存實現(xiàn)分為兩個步驟:(1)創(chuàng)建共享內(nèi)存,使用shmget函數(shù)。(2)映射共享內(nèi)存,將這段創(chuàng)建的共享內(nèi)存映射到具體的進(jìn)程空間去,
共享內(nèi)存進(jìn)程A的邏輯地址空間物理空間進(jìn)程B的邏輯地址空間共享內(nèi)存(1)創(chuàng)建共享內(nèi)存函數(shù)所需頭文件#include<sys/ipc.h>#include<sys/shm.h>函數(shù)原型intshmget(key_tkey,size_tsize,intshmflg);函數(shù)傳入值key:共享內(nèi)存的鍵值,每一個IPC對象與一個key相對應(yīng),key為IPC_PRIVATE指創(chuàng)建私有共享內(nèi)存size:共享內(nèi)存區(qū)大小shmflg:標(biāo)志,與open的權(quán)限位相同,可用八進(jìn)制表示,如0666函數(shù)返回值成功:共享內(nèi)存ID失?。?1所需頭文件#include<sys/ipc.h>#include<sys/shm.h>函數(shù)原型void*shmat(intshmid,constvoid*shmaddr,intshmflg);函數(shù)傳入值shmid:共享內(nèi)存IDshmaddr:將共享內(nèi)存映射到指定地址,0表示系統(tǒng)自動分配地址并把共享內(nèi)存映射到調(diào)用進(jìn)程的地址空間shmflgSHM_RDONLY:共享內(nèi)存只讀0:可讀可寫函數(shù)返回值成功:被映射的段地址失敗:-1(2)映射共享內(nèi)存的函數(shù)共享內(nèi)存(3)共享內(nèi)存解除所需頭文件#include<sys/ipc.h>#include<sys/shm.h>函數(shù)原型intshmdt(constvoid*shmaddr);函數(shù)傳入值shmaddr:被映射的共享內(nèi)存段地址函數(shù)返回值成功:0失?。?1所需頭文件#include<sys/ipc.h>#include<sys/shm.h>函數(shù)原型intshmctl(intshmid,intcmd,structshmid_ds*buf);函數(shù)傳入值shmid:共享內(nèi)存ID
cmdIPC_RMID:刪除shmid指向的共享內(nèi)存段SHM_LOCK:鎖定共享內(nèi)存,只能有超級用戶請求SHM_UNLOCK:對共享內(nèi)存段解鎖,只能超級用戶請求buf:描述共享內(nèi)存段的shmid_ds結(jié)構(gòu)函數(shù)返回值成功:0失?。?1(4)共享內(nèi)存操作操作4.14:w_shm.cr_shm.c信號量Linux操作系統(tǒng)中的信號實現(xiàn)進(jìn)程之間的異步通信,信號量則是用于進(jìn)程間的步控制。在程序中,有時會存在一種特殊代碼,同一時間只允許一個進(jìn)程執(zhí)行該部分代碼。這部分區(qū)域,被稱為"臨界區(qū)"。在多進(jìn)程并發(fā)執(zhí)行中,當(dāng)一個進(jìn)程進(jìn)入臨界區(qū),因某種原因被掛起時,其他進(jìn)程就有可能也進(jìn)入該區(qū)域。解決辦法——使用信號量信號量是一個特殊的變量,一般取正數(shù)值。它的值代表允許訪問的資源數(shù)目。只能對信號量執(zhí)行P操作和V操作。P操作:申請資源。如果信號量的值>0,則把該信號量-1。
如果信號量的值=0,則掛起該進(jìn)程(代表沒有資源可用)。V操作:釋放資源。如果有進(jìn)程因該信號量而被掛起,則恢復(fù)當(dāng)前進(jìn)程運行。
如果沒有進(jìn)程因該信號量而被掛起,則把該信號量+1。信號量信號量的操作通常分為以下幾個步驟。(1)創(chuàng)建信號量或獲取信號量;(2)初始化信號量;(3)進(jìn)行信號量的PV操作;(4)如果不需要信號量,從系統(tǒng)中刪除它。1、信號量創(chuàng)建所需頭文件#include<sys/types.h>#include<sys/ipc.h>#include<sys/sem.h>函數(shù)原型intsemget(key_tkey,intnsems,intsemflg);函數(shù)傳入值key:信號量鍵值nsems:信號量個數(shù)semflg:訪問權(quán)限和創(chuàng)建標(biāo)識,可用八進(jìn)制表示,如0666,IPC_CREAT表示創(chuàng)建新信號量,IPC_EXCL表示如果信號量已經(jīng)存在則該函數(shù)返回出錯,防止重復(fù)創(chuàng)建。函數(shù)返回值成功:信號量ID失敗:-1信號量2、信號量操作所需頭文件#include<sys/types.h>#include<sys/ipc.h>#include<sys/sem.h>函數(shù)原型intsemctl(intsemid,intsemnum,intcmd,unionsemunarg);函數(shù)傳入值semid:信號量IDsemnum:信號量編號,通常取0,當(dāng)使用信號量集才用到cmd:對信號量的各種操作IPC_STAT:獲取信號量信息SETVAL:將信號量值設(shè)置為argGETVAL:獲取信號量值IPC_RMID:刪除信號量arg:需要設(shè)置或獲取信號量的結(jié)構(gòu),是unionsemnn結(jié)構(gòu),要自己定義。結(jié)構(gòu)如下:unionsemun{ intval; structsemid_ds*buf; unsignedshort*array;};函數(shù)返回值IPC_STAT、SETVAL、IPC_RMID:返回0GETVAL:返回信號量的當(dāng)前值失?。?1(1)控制信號量信號量2、信號量操作(2)操作信號量所需頭文件#include<sys/types.h>#include<sys/ipc.h>#include<sys/sem.h>函數(shù)原型intsemop(intsemid,structsembuf*sops,size_tnsops);函數(shù)傳入值semid:信號量IDsops:信號量結(jié)構(gòu)體structsembuf{shortsem_num;//信號量編號,使用單個信號量時,通常取值為0shortsem_op;//信號量操作:取值為-1表示P操作,取值為+1表示V操作shortsem_flg;//通常設(shè)為SEM_UNDO。進(jìn)程沒釋放信號量時,系統(tǒng)自動釋放};nsops:操作數(shù)組sops中的操作個數(shù),通常為1函數(shù)返回值成功:信號量標(biāo)識符失?。?1操作4.15:sem.c總結(jié):1、無名管道、有名管道2、消息隊列3、信號4、共享內(nèi)存5、信號量作業(yè):3、思政:
總結(jié)與作業(yè)THANKYOU!網(wǎng)絡(luò)編程網(wǎng)絡(luò)編程的概述網(wǎng)絡(luò)編程基礎(chǔ)網(wǎng)絡(luò)編程實例
網(wǎng)絡(luò)編程1、什么是網(wǎng)絡(luò)編程網(wǎng)絡(luò)編程就是用來實現(xiàn)網(wǎng)絡(luò)互連的不同計算機上運行的程序間可以進(jìn)行數(shù)據(jù)交換。通俗點也就是讓分布在不同地方的計算機通過網(wǎng)線或其他媒介相互連接在一起,形成網(wǎng)絡(luò),網(wǎng)絡(luò)中每臺計算機相互之間都能進(jìn)行通信。2、Linux網(wǎng)絡(luò)編程的核心概念網(wǎng)絡(luò)編程的核心有:套接字(Sockets)、IP地址、端口號、傳輸控制協(xié)議(TCP)和用戶數(shù)據(jù)報協(xié)議(UDP)等等網(wǎng)絡(luò)編程概述1、網(wǎng)絡(luò)模型網(wǎng)絡(luò)編程基礎(chǔ)1、網(wǎng)絡(luò)模型網(wǎng)絡(luò)編程基礎(chǔ)2、協(xié)議概念:協(xié)議是事先約定好,大家共同遵守的一組規(guī)則。從應(yīng)用程序的角度看,協(xié)議可以理解為數(shù)據(jù)傳輸和數(shù)據(jù)解析的規(guī)則。假設(shè)A、B雙方要傳輸文件,規(guī)定:第一次:傳輸文件名,接收方收到文件名,應(yīng)答OK給傳輸方第二次:發(fā)送文件的尺寸,接收方收到該數(shù)據(jù),再次應(yīng)答一個OK第三次:傳輸文件內(nèi)容,同樣接收方收到數(shù)據(jù)完成后,應(yīng)答OK表示文件內(nèi)容接收成功。網(wǎng)絡(luò)編程基礎(chǔ)2、協(xié)議2.1IP協(xié)議IP協(xié)議也叫網(wǎng)際協(xié)議,特指為實現(xiàn)一個相互連接的網(wǎng)絡(luò)系統(tǒng)上從源地址到目的地址傳輸數(shù)據(jù)包(互聯(lián)網(wǎng)數(shù)據(jù)包)所提供必要功能的協(xié)議。特點:不可靠、無連接網(wǎng)絡(luò)編程基礎(chǔ)2、協(xié)議2.2TCP協(xié)議TCP協(xié)議是一種面向連接的,可靠的傳輸層通信協(xié)議。主要是提供不同主機上的進(jìn)程通信。特點:1.建立連接
使用鏈接
釋放連接(虛電路) 2.TCP數(shù)據(jù)包中包含序號和確認(rèn)序號。 3.對包進(jìn)行排序并檢錯,而損壞的包可以被重傳。服務(wù)對象:
需要高度可靠性且面向連接的服務(wù),如HTTP、FTP、SMTP等等網(wǎng)絡(luò)編程基礎(chǔ)2、協(xié)議2.3UDP協(xié)議UDP是一種面向無連接的傳輸層通信協(xié)議。主要也是提供不同主機上的進(jìn)程間通信。特點:1.發(fā)送數(shù)據(jù)之前不需要建立鏈接。 2.不對數(shù)據(jù)包的順序進(jìn)行檢查。 3.沒有錯誤檢測和重傳機制服務(wù)對象:
主要用于“查詢-應(yīng)答”的服務(wù),如NFS、NTP、DNS等。網(wǎng)絡(luò)編程基礎(chǔ)3、MAC地址、IP地址3.1MAC地址 MAC地址,用于表示網(wǎng)絡(luò)設(shè)備,類似于身份證,且理論上全球唯一。組成:以太網(wǎng)的MAC地址是一個48bit的值。網(wǎng)絡(luò)編程基礎(chǔ)3、MAC地址、IP地址、端口號3.2IP地址
IP地址是一種Internet上的主機編碼方式,也稱為網(wǎng)際協(xié)議地址。它為互聯(lián)網(wǎng)上的每一個網(wǎng)絡(luò)和每一臺主機分配一個邏輯地址,以此來屏蔽物理地址的差異。IPV4地址的組成 IPV4一般使用10進(jìn)制字符串標(biāo)識,比如。網(wǎng)絡(luò)編程基礎(chǔ)3、MAC地址、IP地址、端口3.3端口 TCP/IP協(xié)議采用端口標(biāo)識通信的進(jìn)程,用于區(qū)分一個系統(tǒng)里面的多個進(jìn)程。特點:1.對于同一個端口而言,在不同系統(tǒng)中對應(yīng)著不同的進(jìn)程 2.對于同一個系統(tǒng),一個端口只能被一個進(jìn)程擁有 3.一個進(jìn)程擁有一個端口后,傳輸層送到該端口的數(shù)據(jù)全部被該進(jìn)程接收,同樣的,進(jìn)程送交傳輸層的數(shù)據(jù)也通過該端口被送出。網(wǎng)絡(luò)編程基礎(chǔ)3、MAC地址、IP地址、端口3.3端口
端口號,在網(wǎng)絡(luò)程序中,端口號(port)來標(biāo)識一個運行的網(wǎng)絡(luò)程序。特點:1.端口號是一個無符號短整形的類型 2.每個端口都擁有一個端口號 3.TCP、UDP維護(hù)各自獨立的端口號4.網(wǎng)絡(luò)應(yīng)用程序中,至少要占用一個端口號,也可以占有多個端口號。端口號分配:知名端口(1-1023)、動態(tài)端口(1024-65535)網(wǎng)絡(luò)編程基礎(chǔ)4、字節(jié)序的概述
是指多字節(jié)的存儲順序。分類:
小端格式:將低位字節(jié)數(shù)據(jù)存儲在低地址。低字節(jié)優(yōu)先
大端格式:將高位字節(jié)數(shù)據(jù)存儲在低地址。高字節(jié)優(yōu)先特點:1.一般網(wǎng)絡(luò)協(xié)議指定了通訊字節(jié)序為大端格式 2.只有在多字節(jié)數(shù)據(jù)處理才需要考慮字節(jié)序 3.運行同一臺計算機上的進(jìn)程相互通信時,一般不考慮字節(jié)序。 4.異構(gòu)計算機之間通訊,需要轉(zhuǎn)換自己的字節(jié)序為網(wǎng)絡(luò)字節(jié)序。網(wǎng)絡(luò)編程基礎(chǔ)4、字節(jié)序的概述字節(jié)序轉(zhuǎn)換函數(shù):頭文件#include<arpa/inet.h>uint32_thtonl
(uint32_thostint32)
功能:將32位的主機字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序參數(shù):一個
uint32_t
類型的數(shù)值,表示主機字節(jié)順序的值。返回值:轉(zhuǎn)換后的網(wǎng)絡(luò)字節(jié)順序的
uint32_t
類型的值。uint16_thtons
(uint16_thostint16)
功能:將16位的主機字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序參數(shù):一個
uint16_t
類型的數(shù)值,表示主機字節(jié)順序的值。返回值:轉(zhuǎn)換后的網(wǎng)絡(luò)字節(jié)順序的
uint16_t
類型的值。網(wǎng)絡(luò)編程基礎(chǔ)4、字節(jié)序的概述字節(jié)序轉(zhuǎn)換函數(shù):頭文件#include<arpa/inet.h>uint32_tntohl
(uint32_tnetint32)
功能:將32位的網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換為主機字節(jié)序參數(shù):一個
uint32_t
類型的數(shù)值,表示網(wǎng)絡(luò)字節(jié)順序的值。返回值:轉(zhuǎn)換后的主機字節(jié)順序的
uint32_t
類型的值。uint16_tntohs
(uint16_tnetint16)
功能:將16位的網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換為主機字節(jié)序參數(shù):一個
uint16_t
類型的數(shù)值,表示網(wǎng)絡(luò)字節(jié)順序的值。返回值:轉(zhuǎn)換后的主機字節(jié)順序的
uint16_t
類型的值。操作1:byteOrderConvert.c網(wǎng)絡(luò)編程基礎(chǔ)4、地址轉(zhuǎn)換函數(shù)#include<arpe/inet.h>intinet_pton(intfamily,constchar*strptr,void*addrptr);功能:將點分十進(jìn)制的ip地址轉(zhuǎn)化為32位無符號整型數(shù)參數(shù): family:協(xié)議族(IPv4地址,使用AF_INET) strptr:點分十進(jìn)制數(shù)串 addrptr:32位無符號整型地址
返回值:成功1,失敗其他網(wǎng)絡(luò)編程基礎(chǔ)4、地址轉(zhuǎn)換函數(shù)#include<arpe/inet.h>constchar*inet_ntop(intfamily,void*addrptr,constchar*strptr,size_tlen);功能:將32位無符號整型數(shù)轉(zhuǎn)換為點分十進(jìn)制串參數(shù): family:協(xié)議族(IPv4地址,使用AF_INET) addrptr:32位無符號整型地址 strptr:點分十進(jìn)制數(shù)串 len:strptr緩存區(qū)長度返回值:成功:范圍字符串的首地址,失敗:返回NULL網(wǎng)絡(luò)編程基礎(chǔ)4、地址轉(zhuǎn)換函數(shù)操作2:ipaddrConvert.c網(wǎng)絡(luò)編程基礎(chǔ)4、地址轉(zhuǎn)換函數(shù)int
inet_addr(const
char
*cp)功能:將點分十進(jìn)制ip地址轉(zhuǎn)化為整形數(shù)據(jù)
參數(shù)
cp:點分十進(jìn)制ip地址返回值:成功:整型數(shù)據(jù)char*inet_ntoa(structin_addrin)功能:將整型數(shù)據(jù)轉(zhuǎn)換為十進(jìn)制IP地址參數(shù):in:保存IP地址的結(jié)構(gòu)體返回值:成功:點分十進(jìn)制IP地址只能用于IPV4的地址?。。【W(wǎng)絡(luò)編程基礎(chǔ)5、網(wǎng)絡(luò)的編程接口socket(套接字) Linux中的網(wǎng)絡(luò)編程通過Socket(套接字)實現(xiàn),Socket是一種文件描述符。提供不同主機上的進(jìn)程之間的通信。特點: 1.socket也稱“套接字” 2.是一種文件描述符,代表了一個通信管道的一個端點 3.類似文件的操作一樣,可以使用read/write/close等函數(shù)對socket套接字進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)的收取和發(fā)送等操作。 4.得到socket套接字的方法就是調(diào)用函數(shù)socket();網(wǎng)絡(luò)編程基礎(chǔ)5、網(wǎng)絡(luò)的編程接口socket(套接字)socket的分類:?流式套接字(SOCK_STREAM)
流式套接字可以提供可靠的、面向連接的通訊流,它使用TCP協(xié)議。TCP保證了數(shù)據(jù)?傳輸?shù)恼_性和順序性。數(shù)據(jù)報套接字(SOCK_DGRAM)數(shù)據(jù)報套接字定義了一種無連接的服務(wù),數(shù)據(jù)通過相互獨立的報文進(jìn)行傳輸,是無序的,并且不保證可靠,無差錯,它使用數(shù)據(jù)報協(xié)議UDP。?原始套接字(SOCK_RAW)原始套接字允許使用IP協(xié)議,主要用于新的網(wǎng)絡(luò)協(xié)議的測試等。網(wǎng)絡(luò)編程基礎(chǔ)5、網(wǎng)絡(luò)的編程接口socket(套接字)#include<sys/socket.h>intsocket(intfamily,inttype,intprotocol)功能:創(chuàng)建一個用于網(wǎng)絡(luò)通信的socket套接字(文件描述符)參數(shù): family:協(xié)議族(IPv4地址,使用AF_INET) type:套接字類型 protocol:協(xié)議類別,通常填0返回值:套接字網(wǎng)絡(luò)編程基礎(chǔ)5、網(wǎng)絡(luò)的編程接口socket(套接字)#include<sys/socket.h>intbind(intsockfd,conststructsockaddr*addr,socklen_taddrlen)功能:用于將套接字與特定的IP地址和端口號綁定參數(shù):
sockfd:套接字描述符,由socket函數(shù)返回。 addr:指向structsockaddr結(jié)構(gòu)體的指針,該結(jié)構(gòu)體中包含了要綁定的IP地址和端口號。對于IPv4地址,通常使用structsockaddr_in結(jié)構(gòu)體。 addrlen:addr結(jié)構(gòu)體的長度,以字節(jié)為單位。例如,對于structsockaddr_in,該值應(yīng)為sizeof(structsockaddr_in)。返回值如果綁定成功,返回0。如果綁定失敗,返回-1網(wǎng)絡(luò)編程基礎(chǔ)5、網(wǎng)絡(luò)的編程接口socket(套接字)#include<sys/socket.h>intconnect(intsockfd,conststructsockaddr*addr,socklen_taddrlen);功能:用于建立與遠(yuǎn)程主機的連接的函數(shù)參數(shù):
sockfd:套接字描述符,由socket函數(shù)返回。它標(biāo)識了要進(jìn)行連接操作的套接字。 addr:指向structsockaddr結(jié)構(gòu)體的指針,該結(jié)構(gòu)體中包含了要連接的遠(yuǎn)程主機的IP地址和端口號。對于IPv4地址,通常使用structsockaddr_in結(jié)構(gòu)體。 addrlen:addr結(jié)構(gòu)體的長度,以字節(jié)為單位返回值:如果連接成功建立,返回0。如果連接失敗,返回-1,網(wǎng)絡(luò)編程基礎(chǔ)5、網(wǎng)絡(luò)的編程接口socket(套接字)#include<sys/socket.h>intlisten(intsockfd,intbacklog);功能:使服務(wù)器套接字進(jìn)入監(jiān)聽狀態(tài)的函數(shù)參數(shù):sockfd:服務(wù)器套接字的文件描述符,通常是由socket函數(shù)創(chuàng)建并返回的。 backlog:指定同時連接的最大掛起數(shù),即在服務(wù)器開始拒絕新的連接請求之前,可以排隊等待處理的未完成連接的最大數(shù)量。該參數(shù)用于控制并發(fā)連接的數(shù)量。返回值:成功,返回0。失敗,返回-1,網(wǎng)絡(luò)編程基礎(chǔ)5、網(wǎng)絡(luò)的編程接口socket(套接字)#include<sys/socket.h>intaccept(intsockfd,structsockaddr*addr,socklen_t*addrlen);功能:接受客戶端連接的函數(shù)之一參數(shù):sockfd:服務(wù)器端的套接字描述符。 addr:指向structsockaddr結(jié)構(gòu)體的指針,用于存儲客戶端的地址信息。當(dāng)accept函數(shù)成功返回時,該結(jié)構(gòu)體將被填充客戶端的地址信息。通常使用structsockaddr_in結(jié)構(gòu)體來表示IPv4地址。 addrlen:指向socklen_t類型的指針,表示addr結(jié)構(gòu)體的長度。在調(diào)用accept函數(shù)之前,應(yīng)將該值設(shè)置為addr結(jié)構(gòu)體的實際大小。返回值:成功,它會返回一個新的套接字。失敗,返回-1,網(wǎng)絡(luò)編程基礎(chǔ)5、網(wǎng)絡(luò)的編程接口socket(套接字)#include<sys/socket.h>ssize_tsend(intsockfd,constvoid*buf,size_tlen,intflags);功能:在網(wǎng)絡(luò)套接字上進(jìn)行數(shù)據(jù)發(fā)送的函數(shù)參數(shù):sockfd:套接字描述符,表示發(fā)送數(shù)據(jù)的套接字。 buf:指向要發(fā)送數(shù)據(jù)的緩沖區(qū)的指針。 len:要發(fā)送數(shù)據(jù)的字節(jié)數(shù)。 flags:發(fā)送選項的標(biāo)志位,可以是0或者一些特定的選項按位或運算的結(jié)果。常用的選項包括MSG_DONTWAIT(非阻塞發(fā)送)等。返回值:成功,返回實際發(fā)送的字節(jié)數(shù)。失敗,返回-1,網(wǎng)絡(luò)編程基礎(chǔ)5、網(wǎng)絡(luò)的編程接口socket(套接字)#include<sys/socket.h>ssize_trecv(intsockfd,void*buf,size_tlen,intflags);功能:在網(wǎng)絡(luò)套接字上進(jìn)行數(shù)據(jù)接收的函數(shù)參數(shù):sockfd:套接字描述符,表示接收數(shù)據(jù)的套接字。 buf:指向接收緩沖區(qū)的指針,用于存儲接收到的數(shù)據(jù)。 len:接收緩沖區(qū)的長度,即最大可接收的字節(jié)數(shù)。 flags:接收選項的標(biāo)志位,可以是0或者一些特定的選項按位或運算的結(jié)果。常用的選項包括MSG_DONTWAIT(非阻塞接收)等。返回值:成功:實際接收的字節(jié)數(shù),失敗:-1網(wǎng)絡(luò)編程基礎(chǔ)5、網(wǎng)絡(luò)的編程接口socket(套接字)#include<sys/socket.h>ssize_tsendto(intsockfd,constvoid*buf,size_tlen,intflags,conststructsockaddr*dest_addr,socklen_taddrlen);功能:用于在網(wǎng)絡(luò)套接字上進(jìn)行數(shù)據(jù)發(fā)送和接收的函數(shù),與send和recv函數(shù)類似,但提供了更多的功能參數(shù):sockfd:套接字描述符,表示發(fā)送數(shù)據(jù)的套接字。 buf:指向要發(fā)送數(shù)據(jù)的緩沖區(qū)的指針。 len:要發(fā)送數(shù)據(jù)的字節(jié)數(shù)。 flags:發(fā)送選項的標(biāo)志位 dest_addr:指向目標(biāo)地址的指針,表示數(shù)據(jù)要發(fā)送到的目標(biāo)地址。該地址應(yīng)該是由sockaddr結(jié)構(gòu)體或其兼容類型(如sockaddr_in)表示的。 addrlen:目標(biāo)地址的長度,以字節(jié)為單位。返回值:成功:實際發(fā)送的字節(jié)數(shù),失?。?1網(wǎng)絡(luò)編程基礎(chǔ)5、網(wǎng)絡(luò)的編程接口socket(套接字)#include<sys/socket.h>ssize_trecvfrom(intsockfd,void*buf,size_tlen,intflags,structsockaddr*src_addr,socklen_t*addrlen);功能:用于在網(wǎng)絡(luò)套接字上進(jìn)行數(shù)據(jù)發(fā)送和接收的函數(shù),與send和recv函數(shù)類似,但提供了更多的功能參數(shù):sockfd:套接字描述符,表示接收數(shù)據(jù)的套接字。 buf:指向接收緩沖區(qū)的指針,用于存儲接收到的數(shù)據(jù)。 len:接收緩沖區(qū)的長度,即最大可接收的字節(jié)數(shù)。 flags:接收選項的標(biāo)志位, src_addr:指向源地址的指針,用于存儲發(fā)送端的地址信息。該地址應(yīng)該是由sockaddr結(jié)構(gòu)體或其兼容類型(如sockaddr_in)表示的。如果不關(guān)心發(fā)送端的地址信息,可以將該參數(shù)設(shè)置為NULL。 addrlen:指向源地址長度的指針,表示src_addr結(jié)構(gòu)體的長度。在調(diào)用函數(shù)之前,應(yīng)將該值設(shè)置為結(jié)構(gòu)體的大小。返回值:成功:實際接收的字節(jié)數(shù),失敗:-1網(wǎng)絡(luò)編程基礎(chǔ)1.TCP網(wǎng)絡(luò)程序的設(shè)計基于TCP-服務(wù)器1.創(chuàng)建一個socket,用函數(shù)socket()2.綁定IP地址、端口等信息到socket上,用函
數(shù)bind()3.設(shè)置允許的最大連接數(shù),用函數(shù)listen()4.等待來自客戶端的連接請求,用函數(shù)accept()5.收發(fā)數(shù)據(jù),用函數(shù)send()和recv(),或者read()和write()6.關(guān)閉網(wǎng)絡(luò)連接網(wǎng)絡(luò)編程實例1.TCP網(wǎng)絡(luò)程序的設(shè)計基于TCP-客戶端1.創(chuàng)建一個socket,用函數(shù)socket()2.設(shè)置要連接的服務(wù)器的IP地址和端口等屬性3.連接服務(wù)器,用函數(shù)connect()4.收發(fā)數(shù)據(jù),用函數(shù)send()和recv(),或者read()和write()5.關(guān)閉網(wǎng)絡(luò)連接網(wǎng)絡(luò)編程實例1.TCP網(wǎng)絡(luò)程序的設(shè)計網(wǎng)絡(luò)編程實例2.UDP網(wǎng)絡(luò)程序的設(shè)計基于UDP-服務(wù)器1.創(chuàng)建一個socket,用函數(shù)socket()2.綁定IP地址、端口等信息到socket上,
用函數(shù)bind()3.循環(huán)接收數(shù)據(jù),用函數(shù)recvfrom()4.關(guān)閉網(wǎng)絡(luò)連接基于UDP-客戶端1.創(chuàng)建一個socket,用函數(shù)socket()2.綁定IP地址、端口等信息到socket上,用函數(shù)bind()3.設(shè)置對方的IP地址和端口等屬性4.發(fā)送數(shù)據(jù),用函數(shù)sendto()5.關(guān)閉網(wǎng)絡(luò)連接網(wǎng)絡(luò)編程實例2.UDP網(wǎng)絡(luò)程序的設(shè)計網(wǎng)絡(luò)編程實例網(wǎng)絡(luò)程序的實例實例:tcp_server.c和tcp_client.c實例:udp_server.c和udp_client.cTHANKYOU!03PARTTHERE正大氣象厚德載物MinnanUniversityofScienceandTechnology多線程編程線程簡介線程的基本操作線程的程序編寫線程1、什么是線程線程(thread)是操作系統(tǒng)能夠進(jìn)行運算調(diào)度的最小單位。它被包含在進(jìn)程之中,是進(jìn)程中的實際運作單位。一條線程指的是進(jìn)程中一個單一順序的控制流,一個進(jìn)程中可以并發(fā)多個線程,每條線程并行執(zhí)行不同的任務(wù)。2、線程和進(jìn)程的比較1)調(diào)度2)擁有資源3)系統(tǒng)開銷4)并發(fā)性一、線程簡介3、多線程多線程(multithreading),是指從軟件或者硬件上實現(xiàn)多個線程并發(fā)執(zhí)行的技術(shù)。應(yīng)用:多任務(wù)程序設(shè)計、并發(fā)程序設(shè)計、網(wǎng)絡(luò)程序設(shè)計、共享數(shù)據(jù)……4、線程號進(jìn)程號在整個系統(tǒng)中是唯一的,但線程號不同,線程號只在它所屬的進(jìn)程環(huán)境中有效。進(jìn)程號用pid_t數(shù)據(jù)類型表示,是一個非負(fù)整數(shù)。線程號則用pthrcad_t數(shù)據(jù)類型來表示。一、線程簡介5、線程四種狀態(tài)遷移圖一、線程簡介就緒態(tài)創(chuàng)建被調(diào)度運行態(tài)被搶占阻塞態(tài)等待資源條件被滿足終止態(tài)完成或者被取消1、線程的創(chuàng)建#include<pthread.h>int
pthread_create(pthread_t
*thread,
const
pthread_attr_t
*attr, void
*(*start_routine)(void*),
void
*arg);參數(shù): thread:
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024事業(yè)單位聘用合同糾紛處理與法律適用總結(jié)3篇
- 2024年多功能設(shè)備維護(hù)合作協(xié)議2篇
- 2024年度數(shù)據(jù)保密與信息安全認(rèn)證協(xié)議3篇
- 2025年拉薩貨運上崗證考試題庫1387題
- 洛陽文化旅游職業(yè)學(xué)院《黑臭水體治理技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 科技創(chuàng)新資金撥付管理
- 甘肅省隴南市2024-2025學(xué)年高一上學(xué)期期中考試歷史試卷(解析版)
- 信息技術(shù)部門組織結(jié)構(gòu)
- 城市綠化監(jiān)控系統(tǒng)安裝合同
- 2024年廢棄水塘承包合同最長期限3篇
- 2023-2024學(xué)年廣東省湛江市赤坎區(qū)某中學(xué)七年級上學(xué)期期末數(shù)學(xué)試卷及參考答案
- (完整)蘇教版小學(xué)五年級上冊數(shù)學(xué)口算練習(xí)題
- 河南師范大學(xué)《思想政治教育方法論》2023-2024學(xué)年第一學(xué)期期末試卷
- 考研英語(一201)研究生考試試卷及答案指導(dǎo)(2025年)
- 期末試卷(試題)-2024-2025學(xué)年滬教版三年級上冊數(shù)學(xué)
- 2024年學(xué)校安全工作考核辦法及獎懲制度范文(四篇)
- 公務(wù)員2022年國考《申論》真題及答案解析(地市級)
- 政府采購評審專家考試題及答案
- 2024新能源光伏電站運行規(guī)程
- 屋頂氣窗施工方案
- 小學(xué)高年級段學(xué)生數(shù)學(xué)講題比賽教學(xué)活動安排方案
評論
0/150
提交評論