




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
LINUX應(yīng)用編程–
進(jìn)程間通訊2009年12月22日2LINUX應(yīng)用編程-目錄IPC概述管道FIFO共享存儲(chǔ)套接字信號量消息隊(duì)列3進(jìn)程間通訊–IPC概述信號(signal)親緣進(jìn)程和非親緣進(jìn)程都可以,也可以進(jìn)程自己給自己遞送信號。信號量(semaphore)主要是線程間和親緣和非親緣的進(jìn)程間的同步手段,不做數(shù)據(jù)傳輸之用。管道只允許親緣進(jìn)程間的通訊。命名管道(FIFO)除了親緣進(jìn)程可以通訊外,非親緣進(jìn)程也可以通訊。共享內(nèi)存多個(gè)進(jìn)程可以訪問同一塊內(nèi)存空間,是最快的IPC方式。在進(jìn)程間傳遞數(shù)據(jù)時(shí)無須任何內(nèi)存的拷貝。可以在親緣和非親緣的進(jìn)程間使用。套接字最通用的進(jìn)程間通訊方式,它提供了一種讓不同機(jī)器上進(jìn)程間通訊方式。消息隊(duì)列可以用在非親緣關(guān)系的進(jìn)程之間使用4進(jìn)程間通訊–
管道管道是UNIXIPC的最老形式,并且所有UNIX系統(tǒng)都提供此種通信機(jī)制,管道有兩種限制;(1)它們是半雙工的。數(shù)據(jù)只能在一個(gè)方向上流動(dòng)。(2)它們只能在具有公共祖先的進(jìn)程之間使用。通常,一個(gè)管道由一個(gè)進(jìn)程創(chuàng)建,然后該進(jìn)程調(diào)用fork,此后父、子進(jìn)程之間就可應(yīng)用該管道。管道的寫和讀有兩個(gè)特性:(1)數(shù)據(jù)寫入時(shí),放在管道的結(jié)尾。(2)數(shù)據(jù)讀取時(shí),從管道的頭開始讀取。5進(jìn)程間通訊–pipe函數(shù)管道是由調(diào)用pipe函數(shù)而創(chuàng)建的。#include<unistd.h>intpipe(intfiledes[2]);參數(shù)filedes返回兩個(gè)文件描述符:filedes[0]為讀而打開,filedes[1]為寫而打開。filedes[1]的輸出是filedes[0]的輸入。由于管道是單向的,所以通常一個(gè)進(jìn)程需要關(guān)閉寫端或者讀端,而另一個(gè)進(jìn)程則關(guān)閉相應(yīng)的讀端或?qū)懚恕懚瞬淮嬖跁r(shí),讀端會(huì)收到文件結(jié)束符。讀端不存在時(shí),寫端會(huì)收到SIGPIPE信號。如果忽略該信號或者捕捉該信號并從其處理程序返回,則write出錯(cuò)返回,errno設(shè)置為EPIPE成功返回0,失敗返回-1.缺點(diǎn):只能用于親緣進(jìn)程間通訊,在一個(gè)進(jìn)程內(nèi)管道幾乎是沒有實(shí)際用處的在寫管道時(shí),常數(shù)PIPE_BUF規(guī)定了內(nèi)核中管道緩存器的大小。如果對管道進(jìn)行write調(diào)用,而且要求寫的字節(jié)數(shù)小于等于PIPE_BUF,則此操作不會(huì)與其他進(jìn)程對同一管道(或FIFO)的write操作穿插進(jìn)行。但是,若有多個(gè)進(jìn)程同時(shí)寫一個(gè)管道(或FIFO),而且某個(gè)或某些進(jìn)程要求寫的字節(jié)數(shù)超過PIPE_BUF字節(jié)數(shù),則數(shù)據(jù)可能會(huì)與其他寫操作的數(shù)據(jù)相穿插。6進(jìn)程間通訊–fork前后管道關(guān)系fork之后做什么取決于我們想要有的數(shù)據(jù)流的方向。對于從父進(jìn)程到子進(jìn)程的管道,父進(jìn)程關(guān)閉管道的讀端(fd[0]),子進(jìn)程則關(guān)閉寫端(fd[1])Fork后的半雙工管道從父進(jìn)程到子進(jìn)程的管道對于從子進(jìn)程到父進(jìn)程的管道,父進(jìn)程關(guān)閉fd[1],子進(jìn)程關(guān)閉fd[0]7進(jìn)程間通訊–popen和pclose函數(shù)我們常用到的一個(gè)操作是創(chuàng)建一個(gè)連接到另一個(gè)進(jìn)程的管道,然后讀其輸出或向其發(fā)送輸入,所以標(biāo)準(zhǔn)I/O庫為實(shí)現(xiàn)這些操作提供了兩個(gè)函數(shù)popen和pclose。這兩個(gè)函數(shù)實(shí)現(xiàn)的操作是:創(chuàng)建一個(gè)管道,fork一個(gè)子進(jìn)程,關(guān)閉管道的不使用端,exec一個(gè)shell以執(zhí)行命令,等待命令終止。#include<stdio.h>FILE*popen(constchar*command,constchar*type);返回:若成功則為文件指針,若出錯(cuò)則為NULLintpclose(FILE*stream);返回:command的終止?fàn)顟B(tài),若出錯(cuò)則為-1函數(shù)popen先執(zhí)行fork,然后調(diào)用exec以執(zhí)行command,并且返回一個(gè)標(biāo)準(zhǔn)I/O文件指針。如果type是"r",則文件指針連接到command的標(biāo)準(zhǔn)輸出。如果type是“w”,則文件指針連接到command的標(biāo)準(zhǔn)輸入。pclose函數(shù)關(guān)閉標(biāo)準(zhǔn)I/O流,等待命令執(zhí)行結(jié)束,然后返回shell的終止?fàn)顟B(tài)。如果shell不能被執(zhí)行,則pclose返回的終止?fàn)顟B(tài)與shell執(zhí)行exit一樣。8進(jìn)程間通訊–FIFOFIFO有時(shí)被稱為命名管道。管道只能由相關(guān)進(jìn)程使用,它們共同的祖先進(jìn)程創(chuàng)建了管道。但是,通過FIFO,不相關(guān)的進(jìn)程也能交換數(shù)據(jù)。創(chuàng)建FIFO類似于創(chuàng)建文件。確實(shí),F(xiàn)IFO的路徑名存在于文件系統(tǒng)中。#include<sys/types.h>#include<sys/stat.h>intmkfifo(constchar*pathname,mode_tmode);返回0成功,返回-1失敗mkfifo函數(shù)中mode參數(shù)的規(guī)格說明與open函數(shù)中的mode相同。一旦已經(jīng)用mkfifo創(chuàng)建了一個(gè)FIFO,就可用open打開它。確實(shí),一般的文件I/O函數(shù)(open、close、read、write、unlink等)都可用于FIFO。FIFO有兩種用途:(1)FIFO由shell命令使用以便將數(shù)據(jù)從一條管道線傳送到另一條,為此無需創(chuàng)建中間臨時(shí)文件。(2)FIFO用于客戶機(jī)-服務(wù)器應(yīng)用程序中,以在客戶機(jī)和服務(wù)器之間傳遞數(shù)據(jù)9進(jìn)程間通訊–FIFO當(dāng)打開一個(gè)FIFO時(shí),非阻塞標(biāo)志(O_NONBLOCK)產(chǎn)生下列影響:(1)在一般情況中(沒有說明O_NONBLOCK),只讀打開要阻塞到某個(gè)其他進(jìn)程為寫打開此FIFO。類似,為寫而打開一個(gè)FIFO要阻塞到某個(gè)其他進(jìn)程為讀而打開它。(2)如果指定了O_NONBLOCK,則只讀打開立即返回。但是,如果沒有進(jìn)程已經(jīng)為讀而打開一個(gè)FIFO,那么只寫打開將出錯(cuò)返回,其errno是ENXIO。類似于管道,若寫一個(gè)尚無進(jìn)程為讀而打開的FIFO,則產(chǎn)生信號SIGPIPE。若某個(gè)FIFO的最后一個(gè)寫進(jìn)程關(guān)閉了該FIFO,則將為該FIFO的讀進(jìn)程產(chǎn)生一個(gè)文件結(jié)束標(biāo)志。一個(gè)給定的FIFO有多個(gè)寫進(jìn)程是常見的。這就意味著如果不希望多個(gè)進(jìn)程所寫的數(shù)據(jù)互相穿插,則需考慮原子寫操作。正如對于管道一樣,常數(shù)PIPE_BUF說明了可被原子寫到FIFO的最大數(shù)據(jù)量。10進(jìn)程間通訊–
共享存儲(chǔ)共享存儲(chǔ)允許兩個(gè)或多個(gè)進(jìn)程共享一給定的存儲(chǔ)區(qū)。因?yàn)閿?shù)據(jù)不需要在客戶機(jī)和服務(wù)器之間復(fù)制,所以這是最快的一種IPC。使用共享存儲(chǔ)的唯一竅門是多個(gè)進(jìn)程之間對一給定存儲(chǔ)區(qū)的同步存取。若服務(wù)器將數(shù)據(jù)放入共享存儲(chǔ)區(qū),則在服務(wù)器做完這一操作之前,客戶機(jī)不應(yīng)當(dāng)去取這些數(shù)據(jù)。通常,信號量被用來實(shí)現(xiàn)對共享存儲(chǔ)存取的同步。11進(jìn)程間通訊–mmapvoid*mmap(void*addr,size_tlength,intprot,intflags,intfd,off_toffset)mmap在進(jìn)程地址空間創(chuàng)建一個(gè)映射。它既可以把一個(gè)文件映射到內(nèi)存,也可以映射一塊內(nèi)存,實(shí)現(xiàn)進(jìn)程間內(nèi)存共享。addr為共享內(nèi)存的起始地址,為NULL時(shí),內(nèi)核會(huì)自動(dòng)選擇一個(gè)起始地址。length為共享內(nèi)存的長度。prot指明了共享內(nèi)存保護(hù)狀態(tài):PROT_EXEC,PROT_READ,PROT_WRITE,PROT_NONEflagsMAP_SHARED共享此內(nèi)存MAP_PRIVATE只有該進(jìn)程可見。MAP_ANONYMOUS為匿名映射。參數(shù)fd為即將映射到進(jìn)程空間的文件描述字,一般由open()返回,同時(shí),fd可以指定為-1,此時(shí)須指定flags參數(shù)中的MAP_ANON,表明進(jìn)行的是匿名映射(不涉及具體的文件名,避免了文件的創(chuàng)建及打開,很顯然只能用于具有親緣關(guān)系的進(jìn)程間通信)。12進(jìn)程間通訊–
內(nèi)存共享內(nèi)核為每個(gè)共享存儲(chǔ)段設(shè)置了一個(gè)shmid_ds結(jié)構(gòu)。#include<sys/ipc.h>#include<sys/shm.h>#include<sys/types.h>key_tftok(constchar*pathname,intproj_id);intshmget(key_tkey,size_tsize,intshmflg);void*shmat(intshmid,constvoid*shmaddr,intshmflg);intshmdt(constvoid*shmaddr);intshmctl(intshmid,intcmd,structshmid_ds*buf);共享內(nèi)存1314進(jìn)程間通訊–shmget函數(shù)調(diào)用的第一個(gè)函數(shù)通常是shmget,它獲得一個(gè)指定大小的共享存儲(chǔ)標(biāo)識(shí)符。intshmget(key_tkey,size_tsize,intshmflg);key參數(shù)用來標(biāo)識(shí)共享內(nèi)存size參數(shù)該共享存儲(chǔ)段的最小值,如果正在創(chuàng)建一個(gè)新段(一般在服務(wù)器中),則必須指定其size。如果正在存訪一個(gè)現(xiàn)存的段(一個(gè)客戶機(jī)),則將size指定為0。shmflg參數(shù)有IPC_CREAT和IPC_EXCL,最為重要的是在shmflg中指明訪問權(quán)限,跟open的mode參數(shù)一樣。否則會(huì)出現(xiàn)permissiondenied等錯(cuò)誤。返回:若成功則為共享內(nèi)存ID,若出錯(cuò)則為-1key可由ftok()生成。pathname必須為調(diào)用進(jìn)程可以訪問的。proj_id的低8bit有效。pathname和proj_id共同組成一個(gè)key。15進(jìn)程間通訊–shmat一旦創(chuàng)建了一個(gè)共享存儲(chǔ)段,進(jìn)程就可調(diào)用shmat將其連接到它的地址空間中。void*shmat(intshmid,constvoid*addr,intshmflg);返回:若成功則為指向共享存儲(chǔ)段的指針,若出錯(cuò)則為-1共享存儲(chǔ)段連接到調(diào)用進(jìn)程的哪個(gè)地址上與addr參數(shù)以及在flag中是否指定SHM_RND位有關(guān)。(1)如果addr為NULL,則此段連接到由內(nèi)核選擇的第一個(gè)可用地址上。(2)如果addr非NULL,并且沒有指定SHM_RND,則此段連接到addr所指定的地址上。(3)如果addr非0,并且指定了SHM_RND,則此段連接到(addr-(addrmodSHMLBA))所表示的地址上。SHM_RND命令的意思是:取整。SHM_LBA的意思是:低邊界地址倍數(shù),它總是2的乘方。該算式是將地址向下取最近1個(gè)SHMLBA的倍數(shù)。一般應(yīng)指定addr為0,以便由內(nèi)核選擇地址。16進(jìn)程間通訊–shmctlshmctl函數(shù)對共享存儲(chǔ)段執(zhí)行多種操作。intshmctl(intshmid,intcmd,structshmid_ds*buf);cmd參數(shù)指定下列5種命令中一種,使其在shmid指定的段上執(zhí)行:IPC_STAT對此段取shmid_ds結(jié)構(gòu),并存放在由buf指向的結(jié)構(gòu)中。IPC_SET按buf指向的結(jié)構(gòu)中的值設(shè)置與此段相關(guān)結(jié)構(gòu)中的下列三個(gè)字段:shm_perm.uid、shm_perm.gid以及shm_perm.mode。此命令只能由下列兩種進(jìn)程執(zhí)行:一種是其有效用戶ID等于shm_perm.cuid或shm_perm.uid的進(jìn)程;另一種是具有超級用戶特權(quán)的進(jìn)程。
IPC_RMID從系統(tǒng)中刪除該共享存儲(chǔ)段。因?yàn)槊總€(gè)共享存儲(chǔ)段有一個(gè)連接計(jì)數(shù)(shm_nattch在shmid_ds結(jié)構(gòu)中),所以除非使用該段的最后一個(gè)進(jìn)程終止或與該段脫接,否則不會(huì)實(shí)際上刪除該存儲(chǔ)段。不管此段是否仍在使用,該段標(biāo)識(shí)符立即被刪除,所以不能再用shmat與該段連接。此命令只能由下列兩種進(jìn)程執(zhí)行:一種是其有效用戶ID等于shm_perm.cuid或shm_perm.uid的進(jìn)程;另一種是具有超級用戶特權(quán)的進(jìn)程。SHM_LOCK
鎖住共享存儲(chǔ)段。此命令只能由超級用戶執(zhí)行。(禁止換出)SHM_UNLOCK解鎖共享存儲(chǔ)段。此命令只能由超級用戶執(zhí)行。返回:若成功則為0,若出錯(cuò)則為-117進(jìn)程間通訊–shmdt當(dāng)對共享存儲(chǔ)段的操作已經(jīng)結(jié)束時(shí),則調(diào)用shmdt脫接該段。注意,這并不從系統(tǒng)中刪除其標(biāo)識(shí)符以及其數(shù)據(jù)結(jié)構(gòu)。該標(biāo)識(shí)符仍然存在,直至某個(gè)進(jìn)程(一般是服務(wù)器)調(diào)用shmctl(帶命令I(lǐng)PC_RMID)特地刪除它。intshmdt(constvoid*shmaddr);shmaddr參數(shù)是以前調(diào)用shmat時(shí)的返回值。返回:若成功則為0,若出錯(cuò)則為-1Shmex.c例子展示了在親緣關(guān)系的進(jìn)程中內(nèi)存共享wshm.c例子往一片共享內(nèi)存內(nèi)寫入數(shù)據(jù),而rshm.c則從該共享內(nèi)存中讀取數(shù)據(jù)信號量信號量是一個(gè)計(jì)數(shù)器,用于多進(jìn)程對共享數(shù)據(jù)對象的存取訪問控制。為了獲得共享資源,進(jìn)程需要執(zhí)行下列操作:(1)測試控制該資源的信號量。(2)若此信號量的值為正,則進(jìn)程可以使用該資源。進(jìn)程將信號量值減1,表示它使用了一個(gè)資源單位。(3)若此信號量的值為0,則進(jìn)程進(jìn)入睡眠狀態(tài),直至信號量值大于0。若進(jìn)程被喚醒后,它返回至(第(1)步)。18信號量intsemget(key_tkey,intnSemes,intflag)函數(shù)說明:創(chuàng)建信號量,如果引用一個(gè)現(xiàn)存的集合(一個(gè)客戶機(jī)),則將nsems指定為0參數(shù)說明:key-標(biāo)識(shí)信號量的關(guān)鍵字,有三種方法:1、使用IPC-PRIVATE讓系統(tǒng)產(chǎn)生,2、挑選一個(gè)隨機(jī)數(shù),3、使用ftok從文件路徑名中產(chǎn)生nSemes-信號量集中元素個(gè)數(shù),對客戶機(jī),此參數(shù)設(shè)為0Flag-IPC_CREAT;IPC_EXCL只有在信號量集不存在時(shí)創(chuàng)建,對客戶機(jī),此參數(shù)設(shè)為019信號量intsemctl(intsemid,intsemnum,intcmd,/*unionsenumarg*/...)函數(shù)說明:
控制信號量參數(shù)說明:
semid-信號量集的句柄semnum-信號量集的某個(gè)成員cmd-命令I(lǐng)PC_RMID刪除一個(gè)信號量IPC_SET設(shè)置信號量的許可權(quán)
SETVAL
設(shè)置指定信號量的元素的值為agc.val
GETVAL
獲得一個(gè)指定信號量的值
GETPID獲得最后操縱此元素的最后進(jìn)程ID
GETNCNT
獲得等待元素變?yōu)?的進(jìn)程數(shù)
GETZCNT
獲得等待元素變?yōu)?的進(jìn)程數(shù)20信號量unionsenun定義如下:unionsenun{
intval;
structsemid_ds*buf;
unsignedshort*array;}agc;其中semid_ds
定義如下:structsemid_ds{
structipc_pemsem_pem;//operationpemission
structtime_tsem_otime;//lastsemop()time
time_tsem_ctime;//lasttimechangedbysemctl()
structsem*sembase;//ptrtofirstsemaphoreinarray
structsem_queue*sem_pending;//pendingoperations
structsem_queue*sem_pending_last;//lastpendingoperations
structsem_undo*undo;//undorequestsonthisarraryunsigned
shortintsem_nsems;//numberofsemaphoresinset};21信號量intsemop(intsemid,struct
sembuf*sops,unsigned
shortnsops)函數(shù)說明:對信號量+1或-1或測試是否為0函數(shù)參數(shù):semid–sops-指向元素操作數(shù)組
structsembuf{
shortintsem_num;//semaphorenumber
shortintsem_op;//semaphoreoperaion,0,+1,-1
shortintsem_flg;//operationflagSEM_UNDO,IPC_NOWAIT};nsops-數(shù)組中元素操作的個(gè)數(shù)2223信號量(1)最易于處理的情況是sem_op為正。這對應(yīng)于返回進(jìn)程占用的資源。sem_op值加到信號量的值上。如果指定了SEM_UNDO標(biāo)志,則當(dāng)該進(jìn)程終止的時(shí)候會(huì)自動(dòng)將信號量的值恢復(fù)回之前的值。(2)若sem_op為負(fù),則表示要獲取由該信號量控制的資源。如若該信號量的值大于或等于sem_op的絕對值(具有所需的資源),則從信號量值中減去sem_op的絕對值。這保證信號量的結(jié)果值大于或等于0。如果指定了undo標(biāo)志,則sem_op的絕對值也加到該進(jìn)程的此信號量調(diào)整值上。如果信號量值小于sem_op的絕對值(資源不能滿足要求),則:(a)若指定了IPC_NOWAIT,則出錯(cuò)返回EAGAIN;(b)若未指定IPC_NOWAIT,則該信號量的semncnt值加1(因?yàn)閷⑦M(jìn)入睡眠狀態(tài)),然后調(diào)用進(jìn)程被掛起直至下列事件之一發(fā)生:i.此信號量變成大于或等于sem_op的絕對值(即某個(gè)進(jìn)程已釋放了某些資源)。此信號量的semncnt值減1(因?yàn)橐呀Y(jié)束等待),并且從信號量值中減去sem_op的絕對值。如果指定了undo標(biāo)志,則sem_op的絕對值也加到該進(jìn)程的此信號量調(diào)整值上。ii.從系統(tǒng)中刪除了此信號量。在此情況下,函數(shù)出錯(cuò)返回ERMID。24信號量iii.進(jìn)程捕捉到一個(gè)信號,并從信號處理程序返回,在此情況下,此信號量的semncnt值減1(因?yàn)椴辉俚却?,并且函?shù)出錯(cuò)返回EINTR.(3)若sem_op為0,這表示希望等待到該信號量值變成0。如果信號量值當(dāng)前是0,則此函數(shù)立即返回。如果信號量值非0,則:(a)若指定了IPC_NOWAIT,則
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 聚酯產(chǎn)業(yè)鏈中的滌綸纖維考核試卷
- 衛(wèi)生潔具行業(yè)發(fā)展趨勢預(yù)測考核試卷
- 紡織品國際貿(mào)易規(guī)則與慣例考核試卷
- 家具行業(yè)新型商業(yè)模式探索與實(shí)踐考核試卷
- 糖批發(fā)商的多元化發(fā)展考核試卷
- 地毯產(chǎn)業(yè)政策法規(guī)與標(biāo)準(zhǔn)研究考核試卷
- 聚合纖維的環(huán)境友好性評估考核試卷
- 淀粉行業(yè)的供應(yīng)鏈管理與風(fēng)險(xiǎn)控制考核試卷
- 鄰里花園土地權(quán)屬界定及糾紛調(diào)解合同
- 電動(dòng)汽車充電樁建設(shè)與充電樁租賃服務(wù)合同
- 福建省平和廣兆中學(xué)2024?2025學(xué)年高一下學(xué)期3月月考數(shù)學(xué)試卷(含解析)
- 2025春季建投國電準(zhǔn)格爾旗能源有限公司招聘31人(內(nèi)蒙古)筆試參考題庫附帶答案詳解
- 租房養(yǎng)狗合同補(bǔ)充協(xié)議
- 電機(jī)長期維修合同協(xié)議
- 遼寧省沈陽市2023?2024學(xué)年高一下學(xué)期期中考試數(shù)學(xué)試卷(含解析)
- 2025年北京市各區(qū)高三語文一模記敘文范文匯編
- 《農(nóng)村基層干部廉潔履行職責(zé)規(guī)定》解讀與培訓(xùn)
- 華圖面試協(xié)議班合同
- 2025年度全國大學(xué)生就業(yè)創(chuàng)業(yè)知識(shí)競賽題庫及答案(共200題)
- 中華民族發(fā)展史知到課后答案智慧樹章節(jié)測試答案2025年春云南大學(xué)
- 對話式服務(wù)系統(tǒng)架構(gòu)-深度研究
評論
0/150
提交評論