




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、本系列文章中的前兩部分,我們探討管道及信號兩種通信機(jī)制,本文將深入第三部分,介紹系統(tǒng) V 消息隊(duì)列及其相應(yīng) API。消息隊(duì)列(也叫做報(bào)文隊(duì)列)能夠克服早期unix通信機(jī)制的一些缺點(diǎn)。作為早期unix通信機(jī)制之一的信號能夠傳送的信息量有限,后來雖然POSIX 1003.1b在信號的實(shí)時(shí)性方面作了拓廣,使得信號在傳遞信息量方面有了相當(dāng)程度的改進(jìn),但是信號這種通信方式更像"即時(shí)"的通信方式,它要求接受信號的進(jìn)程在某個(gè)時(shí)間范圍內(nèi)對信號做出反應(yīng),因此該信號最多在接受信號進(jìn)程的生命周期內(nèi)才有意義,信號所傳遞的信息是接近于隨進(jìn)程持續(xù)的概念(process-persistent),見附錄
2、1;管道及有名管道及有名管道則是典型的隨進(jìn)程持續(xù)IPC,并且,只能傳送無格式的字節(jié)流無疑會給應(yīng)用程序開發(fā)帶來不便,另外,它的緩沖區(qū)大小也受到限制。消息隊(duì)列就是一個(gè)消息的鏈表??梢园严⒖醋饕粋€(gè)記錄,具有特定的格式以及特定的優(yōu)先級。對消息隊(duì)列有寫權(quán)限的進(jìn)程可以向中按照一定的規(guī)則添加新消息;對消息隊(duì)列有讀權(quán)限的進(jìn)程則可以從消息隊(duì)列中讀走消息。消息隊(duì)列是隨內(nèi)核持續(xù)的(參見附錄 1)。目前主要有兩種類型的消息隊(duì)列:POSIX消息隊(duì)列以及系統(tǒng)V消息隊(duì)列,系統(tǒng)V消息隊(duì)列目前被大量使用??紤]到程序的可移植性,新開發(fā)的應(yīng)用程序應(yīng)盡量使用POSIX消息隊(duì)列。在本系列專題的序(深刻理解Linux進(jìn)程間通信(IPC
3、)中,提到對于消息隊(duì)列、信號燈、以及共享內(nèi)存區(qū)來說,有兩個(gè)實(shí)現(xiàn)版本:POSIX的以及系統(tǒng)V的。Linux內(nèi)核(內(nèi)核因此,本文將主要介紹系統(tǒng)V消息隊(duì)列及其相應(yīng)API。在沒有聲明的情況下,以下討論中指的都是系統(tǒng)V消息隊(duì)列。一、消息隊(duì)列基本概念1. 系統(tǒng)V消息隊(duì)列是隨內(nèi)核持續(xù)的,只有在內(nèi)核重起或者顯示刪除一個(gè)消息隊(duì)列時(shí),該消息隊(duì)列才會真正被刪除。因此系統(tǒng)中記錄消息隊(duì)列的數(shù)據(jù)結(jié)構(gòu)(struct ipc_ids msg_ids)位于內(nèi)核中,系統(tǒng)中的所有消息隊(duì)列都可以在結(jié)構(gòu)msg_ids中找到訪問入口。 2. 消息隊(duì)列就是一個(gè)消息的鏈表。每個(gè)消息隊(duì)列都有一個(gè)隊(duì)列頭,用結(jié)構(gòu)struct msg_queue來
4、描述(參見附錄 2)。隊(duì)列頭中包含了該消息隊(duì)列的大量信息,包括消息隊(duì)列鍵值、用戶ID、組ID、消息隊(duì)列中消息數(shù)目等等,甚至記錄了最近對消息隊(duì)列讀寫進(jìn)程的ID。讀者可以訪問這些信息,也可以設(shè)置其中的某些信息。 3. 下圖說明了內(nèi)核與消息隊(duì)列是怎樣建立起聯(lián)系的:其中:struct ipc_ids msg_ids是內(nèi)核中記錄消息隊(duì)列的全局?jǐn)?shù)據(jù)結(jié)構(gòu);struct msg_queue是每個(gè)消息隊(duì)列的隊(duì)列頭。 從上圖可以看出,全局?jǐn)?shù)據(jù)結(jié)構(gòu) struct ipc_ids msg_ids 可以訪問到每個(gè)消息隊(duì)列頭的第一個(gè)成員:struct kern_ipc_perm;而每個(gè)struct kern_ipc_pe
5、rm能夠與具體的消息隊(duì)列對應(yīng)起來是因?yàn)樵谠摻Y(jié)構(gòu)中,有一個(gè)key_t類型成員key,而key則唯一確定一個(gè)消息隊(duì)列。kern_ipc_perm結(jié)構(gòu)如下:struct kern_ipc_perm /內(nèi)核中記錄消息隊(duì)列的全局?jǐn)?shù)據(jù)結(jié)構(gòu)msg_ids能夠訪問到該結(jié)構(gòu); key_t key; /該鍵值則唯一對應(yīng)一個(gè)消息隊(duì)列 uid_t uid; gid_t gid;uid_t cuid;gid_t cgid;mode_t mode;unsigned long seq;二、操作消息隊(duì)列對消息隊(duì)列的操作無非有下面三種類型:1、 打開或創(chuàng)建消息隊(duì)列消息隊(duì)列的內(nèi)核持續(xù)性要求每個(gè)消息隊(duì)列都在系統(tǒng)范圍內(nèi)對應(yīng)唯一的鍵值
6、,所以,要獲得一個(gè)消息隊(duì)列的描述字,只需提供該消息隊(duì)列的鍵值即可;注:消息隊(duì)列描述字是由在系統(tǒng)范圍內(nèi)唯一的鍵值生成的,而鍵值可以看作對應(yīng)系統(tǒng)內(nèi)的一條路經(jīng)。2、 讀寫操作消息讀寫操作非常簡單,對開發(fā)人員來說,每個(gè)消息都類似如下的數(shù)據(jù)結(jié)構(gòu):struct msgbuflong mtype;char mtext1;mtype成員代表消息類型,從消息隊(duì)列中讀取消息的一個(gè)重要依據(jù)就是消息的類型;mtext是消息內(nèi)容,當(dāng)然長度不一定為1。因此,對于發(fā)送消息來說,首先預(yù)置一個(gè)msgbuf緩沖區(qū)并寫入消息類型和內(nèi)容,調(diào)用相應(yīng)的發(fā)送函數(shù)即可;對讀取消息來說,首先分配這樣一個(gè)msgbuf緩沖區(qū),然后把消息讀入該緩沖
7、區(qū)即可。3、 獲得或設(shè)置消息隊(duì)列屬性:消息隊(duì)列的信息基本上都保存在消息隊(duì)列頭中,因此,可以分配一個(gè)類似于消息隊(duì)列頭的結(jié)構(gòu)(struct msqid_ds,見附錄 2),來返回消息隊(duì)列的屬性;同樣可以設(shè)置該數(shù)據(jù)結(jié)構(gòu)。消息隊(duì)列API1、文件名到鍵值#include <sys/types.h>#include <sys/ipc.h>key_t ftok (char*pathname, char proj);它返回與路徑pathname相對應(yīng)的一個(gè)鍵值。該函數(shù)不直接對消息隊(duì)列操作,但在調(diào)用ipc(MSGGET,)或msgget()來獲得消息隊(duì)列描述字前,往往要調(diào)用該函數(shù)。典型的
8、調(diào)用代碼是: key=ftok(path_ptr, 'a'); ipc_id=ipc(MSGGET, (int)key, flags,0,NULL,0); 2、linux為操作系統(tǒng)V進(jìn)程間通信的三種方式(消息隊(duì)列、信號燈、共享內(nèi)存區(qū))提供了一個(gè)統(tǒng)一的用戶界面:int ipc(unsigned int call, int first, int second, int third, void *ptr, long fifth);第一個(gè)參數(shù)指明對IPC對象的操作方式,對消息隊(duì)列而言共有四種操作:MSGSND、MSGRCV、MSGGET以及MSGCTL,分別代表向消息隊(duì)列發(fā)送消息、從消
9、息隊(duì)列讀取消息、打開或創(chuàng)建消息隊(duì)列、控制消息隊(duì)列;first參數(shù)代表唯一的IPC對象;下面將介紹四種操作。· int ipc(MSGGET, int first, int second, int third, void *ptr, long fifth);與該操作對應(yīng)的系統(tǒng)V調(diào)用為:int msgget( (key_t)first,second)。 · int ipc(MSGCTL, int first, int second, int third, void *ptr, long fifth)與該操作對應(yīng)的系統(tǒng)V調(diào)用為:int msgctl( first,second,
10、(struct msqid_ds*) ptr)。 · int ipc(MSGSND, int first, int second, int third, void *ptr, long fifth);與該操作對應(yīng)的系統(tǒng)V調(diào)用為:int msgsnd( first, (struct msgbuf*)ptr, second, third)。 · int ipc(MSGRCV, int first, int second, int third, void *ptr, long fifth);與該操作對應(yīng)的系統(tǒng)V調(diào)用為:int msgrcv( first,(struct msgbu
11、f*)ptr, second, fifth,third), 注:本人不主張采用系統(tǒng)調(diào)用ipc(),而更傾向于采用系統(tǒng)V或者POSIX進(jìn)程間通信API。原因如下:· 雖然該系統(tǒng)調(diào)用提供了統(tǒng)一的用戶界面,但正是由于這個(gè)特性,它的參數(shù)幾乎不能給出特定的實(shí)際意義(如以first、second來命名參數(shù)),在一定程度上造成開發(fā)不便。 · 正如ipc手冊所說的:ipc()是linux所特有的,編寫程序時(shí)應(yīng)注意程序的移植性問題; · 該系統(tǒng)調(diào)用的實(shí)現(xiàn)不過是把系統(tǒng)V IPC函數(shù)進(jìn)行了封裝,沒有任何效率上的優(yōu)勢; · 系統(tǒng)V在IPC方面的API數(shù)量不多,形式也較簡潔。 3
12、.系統(tǒng)V消息隊(duì)列API系統(tǒng)V消息隊(duì)列API共有四個(gè),使用時(shí)需要包括幾個(gè)頭文件:#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>1)int msgget(key_t key, int msgflg)參數(shù)key是一個(gè)鍵值,由ftok獲得;msgflg參數(shù)是一些標(biāo)志位。該調(diào)用返回與健值key相對應(yīng)的消息隊(duì)列描述字。在以下兩種情況下,該調(diào)用將創(chuàng)建一個(gè)新的消息隊(duì)列:· 如果沒有消息隊(duì)列與健值key相對應(yīng),并且msgflg中包含了IPC_CREAT標(biāo)志位; · key參數(shù)為I
13、PC_PRIVATE; 參數(shù)msgflg可以為以下:IPC_CREAT、IPC_EXCL、IPC_NOWAIT或三者的或結(jié)果。調(diào)用返回:成功返回消息隊(duì)列描述字,否則返回-1。注:參數(shù)key設(shè)置成常數(shù)IPC_PRIVATE并不意味著其他進(jìn)程不能訪問該消息隊(duì)列,只意味著即將創(chuàng)建新的消息隊(duì)列。2)int msgrcv(int msqid, struct msgbuf *msgp, int msgsz, long msgtyp, int msgflg);該系統(tǒng)調(diào)用從msgid代表的消息隊(duì)列中讀取一個(gè)消息,并把消息存儲在msgp指向的msgbuf結(jié)構(gòu)中。msqid為消息隊(duì)列描述字;消息返回后存儲在msg
14、p指向的地址,msgsz指定msgbuf的mtext成員的長度(即消息內(nèi)容的長度),msgtyp為請求讀取的消息類型;讀消息標(biāo)志msgflg可以為以下幾個(gè)常值的或:· IPC_NOWAIT 如果沒有滿足條件的消息,調(diào)用立即返回,此時(shí),errno=ENOMSG · IPC_EXCEPT 與msgtyp>0配合使用,返回隊(duì)列中第一個(gè)類型不為msgtyp的消息 · IPC_NOERROR 如果隊(duì)列中滿足條件的消息內(nèi)容大于所請求的msgsz字節(jié),則把該消息截?cái)?,截?cái)嗖糠謱G失。 msgrcv手冊中詳細(xì)給出了消息類型取不同值時(shí)(>0; <0; =0),調(diào)用
15、將返回消息隊(duì)列中的哪個(gè)消息。msgrcv()解除阻塞的條件有三個(gè):1. 消息隊(duì)列中有了滿足條件的消息; 2. msqid代表的消息隊(duì)列被刪除; 3. 調(diào)用msgrcv()的進(jìn)程被信號中斷; 調(diào)用返回:成功返回讀出消息的實(shí)際字節(jié)數(shù),否則返回-1。3)int msgsnd(int msqid, struct msgbuf *msgp, int msgsz, int msgflg);向msgid代表的消息隊(duì)列發(fā)送一個(gè)消息,即將發(fā)送的消息存儲在msgp指向的msgbuf結(jié)構(gòu)中,消息的大小由msgze指定。對發(fā)送消息來說,有意義的msgflg標(biāo)志為IPC_NOWAIT,指明在消息隊(duì)列沒有足夠空間容納要發(fā)
16、送的消息時(shí),msgsnd是否等待。造成msgsnd()等待的條件有兩種:· 當(dāng)前消息的大小與當(dāng)前消息隊(duì)列中的字節(jié)數(shù)之和超過了消息隊(duì)列的總?cè)萘浚?· 當(dāng)前消息隊(duì)列的消息數(shù)(單位"個(gè)")不小于消息隊(duì)列的總?cè)萘浚▎挝?quot;字節(jié)數(shù)"),此時(shí),雖然消息隊(duì)列中的消息數(shù)目很多,但基本上都只有一個(gè)字節(jié)。 msgsnd()解除阻塞的條件有三個(gè): 1. 不滿足上述兩個(gè)條件,即消息隊(duì)列中有容納該消息的空間; 2. msqid代表的消息隊(duì)列被刪除; 3. 調(diào)用msgsnd()的進(jìn)程被信號中斷; 調(diào)用返回:成功返回0,否則返回-1。4)int msgctl(int
17、 msqid, int cmd, struct msqid_ds *buf);該系統(tǒng)調(diào)用對由msqid標(biāo)識的消息隊(duì)列執(zhí)行cmd操作,共有三種cmd操作:IPC_STAT、IPC_SET 、IPC_RMID。1. IPC_STAT:該命令用來獲取消息隊(duì)列信息,返回的信息存貯在buf指向的msqid結(jié)構(gòu)中; 2. IPC_SET:該命令用來設(shè)置消息隊(duì)列的屬性,要設(shè)置的屬性存儲在buf指向的msqid結(jié)構(gòu)中;可設(shè)置屬性包括:msg_perm.uid、msg_perm.gid、msg_perm.mode以及msg_qbytes,同時(shí),也影響msg_ctime成員。 3. IPC_RMID:刪除msqi
18、d標(biāo)識的消息隊(duì)列; 調(diào)用返回:成功返回0,否則返回-1。三、消息隊(duì)列的限制每個(gè)消息隊(duì)列的容量(所能容納的字節(jié)數(shù))都有限制,該值因系統(tǒng)不同而不同。在后面的應(yīng)用實(shí)例中,輸出了redhat 8.0的限制,結(jié)果參見附錄 3。另一個(gè)限制是每個(gè)消息隊(duì)列所能容納的最大消息數(shù):在redhad 8.0中,該限制是受消息隊(duì)列容量制約的:消息個(gè)數(shù)要小于消息隊(duì)列的容量(字節(jié)數(shù))。注:上述兩個(gè)限制是針對每個(gè)消息隊(duì)列而言的,系統(tǒng)對消息隊(duì)列的限制還有系統(tǒng)范圍內(nèi)的最大消息隊(duì)列個(gè)數(shù),以及整個(gè)系統(tǒng)范圍內(nèi)的最大消息數(shù)。一般來說,實(shí)際開發(fā)過程中不會超過這個(gè)限制。四、消息隊(duì)列應(yīng)用實(shí)例消息隊(duì)列應(yīng)用相對較簡單,下面實(shí)例基本上覆蓋了對消息隊(duì)
19、列的所有操作,同時(shí),程序輸出結(jié)果有助于加深對前面所講的某些規(guī)則及消息隊(duì)列限制的理解。#include <sys/types.h>#include <sys/msg.h>#include <unistd.h>void msg_stat(int,struct msqid_ds );main()int gflags,sflags,rflags;key_t key;int msgid;int reval;struct msgsbuf int mtype; char mtext1; msg_sbuf;struct msgmbuf int mtype; char mte
20、xt10; msg_rbuf;struct msqid_ds msg_ginfo,msg_sinfo;char* msgpath="/unix/msgqueue"key=ftok(msgpath,'a');gflags=IPC_CREAT|IPC_EXCL;msgid=msgget(key,gflags|00666);if(msgid=-1) printf("msg create errorn"); return;/創(chuàng)建一個(gè)消息隊(duì)列后,輸出消息隊(duì)列缺省屬性msg_stat(msgid,msg_ginfo);sflags=IPC_NOWAI
21、T;msg_sbuf.mtype=10;msg_sbuf.mtext0='a'reval=msgsnd(msgid,&msg_sbuf,sizeof(msg_sbuf.mtext),sflags);if(reval=-1) printf("message send errorn");/發(fā)送一個(gè)消息后,輸出消息隊(duì)列屬性msg_stat(msgid,msg_ginfo);rflags=IPC_NOWAIT|MSG_NOERROR;reval=msgrcv(msgid,&msg_rbuf,4,10,rflags);if(reval=-1) prin
22、tf("read msg errorn");else printf("read from msg queue %d bytesn",reval);/從消息隊(duì)列中讀出消息后,輸出消息隊(duì)列屬性msg_stat(msgid,msg_ginfo);msg_sinfo.msg_perm.uid=8;/just a trymsg_sinfo.msg_perm.gid=8;/msg_sinfo.msg_qbytes=16388;/此處驗(yàn)證超級用戶可以更改消息隊(duì)列的缺省msg_qbytes/注意這里設(shè)置的值大于缺省值reval=msgctl(msgid,IPC_SET,
23、&msg_sinfo);if(reval=-1) printf("msg set info errorn"); return;msg_stat(msgid,msg_ginfo);/驗(yàn)證設(shè)置消息隊(duì)列屬性reval=msgctl(msgid,IPC_RMID,NULL);/刪除消息隊(duì)列if(reval=-1) printf("unlink msg queue errorn"); return;void msg_stat(int msgid,struct msqid_ds msg_info)int reval;sleep(1);/只是為了后面輸出時(shí)間的
24、方便reval=msgctl(msgid,IPC_STAT,&msg_info);if(reval=-1) printf("get msg info errorn"); return;printf("n");printf("current number of bytes on queue is %dn",msg_info.msg_cbytes);printf("number of messages in queue is %dn",msg_info.msg_qnum);printf("max nu
25、mber of bytes on queue is %dn",msg_info.msg_qbytes);/每個(gè)消息隊(duì)列的容量(字節(jié)數(shù))都有限制MSGMNB,值的大小因系統(tǒng)而異。在創(chuàng)建新的消息隊(duì)列時(shí),/msg_qbytes的缺省值就是MSGMNBprintf("pid of last msgsnd is %dn",msg_info.msg_lspid);printf("pid of last msgrcv is %dn",msg_info.msg_lrpid);printf("last msgsnd time is %s",
26、ctime(&(msg_info.msg_stime);printf("last msgrcv time is %s", ctime(&(msg_info.msg_rtime);printf("last change time is %s", ctime(&(msg_info.msg_ctime);printf("msg uid is %dn",msg_info.msg_perm.uid);printf("msg gid is %dn",msg_info.msg_perm.gid);程序輸出
27、結(jié)果見附錄 3。小結(jié):消息隊(duì)列與管道以及有名管道相比,具有更大的靈活性,首先,它提供有格式字節(jié)流,有利于減少開發(fā)人員的工作量;其次,消息具有類型,在實(shí)際應(yīng)用中,可作為優(yōu)先級使用。這兩點(diǎn)是管道以及有名管道所不能比的。同樣,消息隊(duì)列可以在幾個(gè)進(jìn)程間復(fù)用,而不管這幾個(gè)進(jìn)程是否具有親緣關(guān)系,這一點(diǎn)與有名管道很相似;但消息隊(duì)列是隨內(nèi)核持續(xù)的,與有名管道(隨進(jìn)程持續(xù))相比,生命力更強(qiáng),應(yīng)用空間更大。附錄 1:在參考文獻(xiàn)1中,給出了IPC隨進(jìn)程持續(xù)、隨內(nèi)核持續(xù)以及隨文件系統(tǒng)持續(xù)的定義:1. 隨進(jìn)程持續(xù):IPC一直存在到打開IPC對象的最后一個(gè)進(jìn)程關(guān)閉該對象為止。如管道和有名管道; 2. 隨內(nèi)核持續(xù):IPC一
28、直持續(xù)到內(nèi)核重新自舉或者顯示刪除該對象為止。如消息隊(duì)列、信號燈以及共享內(nèi)存等; 3. 隨文件系統(tǒng)持續(xù):IPC一直持續(xù)到顯示刪除該對象為止。 附錄 2:結(jié)構(gòu)msg_queue用來描述消息隊(duì)列頭,存在于系統(tǒng)空間:struct msg_queue struct kern_ipc_perm q_perm; time_t q_stime; /* last msgsnd time */ time_t q_rtime; /* last msgrcv time */ time_t q_ctime; /* last change time */ unsigned long q_cbytes; /* curren
29、t number of bytes on queue */ unsigned long q_qnum; /* number of messages in queue */ unsigned long q_qbytes; /* max number of bytes on queue */ pid_t q_lspid; /* pid of last msgsnd */ pid_t q_lrpid; /* last receive pid */ struct list_head q_messages; struct list_head q_receivers; struct list_head q
30、_senders;結(jié)構(gòu)msqid_ds用來設(shè)置或返回消息隊(duì)列的信息,存在于用戶空間;struct msqid_ds struct ipc_perm msg_perm; struct msg *msg_first; /* first message on queue,unused */ struct msg *msg_last; /* last message in queue,unused */ _kernel_time_t msg_stime; /* last msgsnd time */ _kernel_time_t msg_rtime; /* last msgrcv time */ _k
31、ernel_time_t msg_ctime; /* last change time */ unsigned long msg_lcbytes; /* Reuse junk fields for 32 bit */ unsigned long msg_lqbytes; /* ditto */ unsigned short msg_cbytes; /* current number of bytes on queue */ unsigned short msg_qnum; /* number of messages in queue */ unsigned short msg_qbytes;
32、/* max number of bytes on queue */ _kernel_ipc_pid_t msg_lspid; /* pid of last msgsnd */ _kernel_ipc_pid_t msg_lrpid; /* last receive pid */;/可以看出上述兩個(gè)結(jié)構(gòu)很相似。附錄 3:消息隊(duì)列實(shí)例輸出結(jié)果:current number of bytes on queue is 0number of messages in queue is 0max number of bytes on queue is 16384pid of last msgsnd is
33、0pid of last msgrcv is 0last msgsnd time is Thu Jan 1 08:00:00 1970last msgrcv time is Thu Jan 1 08:00:00 1970last change time is Sun Dec 29 18:28:20 2002msg uid is 0msg gid is 0/上面剛剛創(chuàng)建一個(gè)新消息隊(duì)列時(shí)的輸出current number of bytes on queue is 1number of messages in queue is 1max number of bytes on queue is 16384pid of last msgsnd is 2510pid of last msgrcv is 0last msgsnd time is Sun Dec 29 18:28:21 2002last msgrcv
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025浙江紹興上虞曹娥里十三弄運(yùn)營管理有限公司合同制職工招聘16人筆試參考題庫附帶答案詳解
- 2025天津東疆綜合保稅區(qū)管理委員會招聘10人筆試參考題庫附帶答案詳解
- 上海電機(jī)學(xué)院《自然地理》2023-2024學(xué)年第二學(xué)期期末試卷
- 北京城市學(xué)院《醫(yī)學(xué)文獻(xiàn)獲取與研究利用》2023-2024學(xué)年第二學(xué)期期末試卷
- 南京機(jī)電職業(yè)技術(shù)學(xué)院《基礎(chǔ)生物化學(xué)A(實(shí)驗(yàn))》2023-2024學(xué)年第二學(xué)期期末試卷
- 安徽財(cái)經(jīng)大學(xué)《云平臺技術(shù)綜合設(shè)計(jì)》2023-2024學(xué)年第二學(xué)期期末試卷
- 鶴壁職業(yè)技術(shù)學(xué)院《園林建筑構(gòu)造》2023-2024學(xué)年第二學(xué)期期末試卷
- 寧德師范學(xué)院《文化遺產(chǎn)創(chuàng)新創(chuàng)業(yè)》2023-2024學(xué)年第二學(xué)期期末試卷
- 寧夏民族職業(yè)技術(shù)學(xué)院《學(xué)前兒童特殊教育》2023-2024學(xué)年第二學(xué)期期末試卷
- 山東中醫(yī)藥高等??茖W(xué)校《基礎(chǔ)護(hù)理學(xué)(一)》2023-2024學(xué)年第二學(xué)期期末試卷
- 邊境心理測試題及答案
- 邊境管理測試題及答案
- 數(shù)量間的加減關(guān)系(課件)-一年級下冊數(shù)學(xué)人教版
- GB/T 4340.2-2025金屬材料維氏硬度試驗(yàn)第2部分:硬度計(jì)的檢驗(yàn)與校準(zhǔn)
- 【電動汽車兩檔AMT自動變速器傳動結(jié)構(gòu)計(jì)算設(shè)計(jì)9800字(論文)】
- 普惠金融大學(xué)試題及答案
- 公交場門衛(wèi)管理制度
- 2025-2030納米銀行業(yè)市場深度調(diào)研及前景趨勢與投資研究報(bào)告
- 全媒體運(yùn)營師運(yùn)營管理技能試題及答案
- 教育社會功能課件
- 區(qū)域市場拓展傭金合同(2篇)
評論
0/150
提交評論