LINUX環(huán)境編程-進(jìn)程間通訊_第1頁(yè)
LINUX環(huán)境編程-進(jìn)程間通訊_第2頁(yè)
LINUX環(huán)境編程-進(jìn)程間通訊_第3頁(yè)
LINUX環(huán)境編程-進(jìn)程間通訊_第4頁(yè)
LINUX環(huán)境編程-進(jìn)程間通訊_第5頁(yè)
已閱讀5頁(yè),還剩24頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

LINUX應(yīng)用編程–

進(jìn)程間通訊2009年12月22日2LINUX應(yīng)用編程-目錄IPC概述管道FIFO共享存儲(chǔ)套接字信號(hào)量消息隊(duì)列3進(jìn)程間通訊–IPC概述信號(hào)(signal)親緣進(jìn)程和非親緣進(jìn)程都可以,也可以進(jìn)程自己給自己遞送信號(hào)。信號(hào)量(semaphore)主要是線程間和親緣和非親緣的進(jìn)程間的同步手段,不做數(shù)據(jù)傳輸之用。管道只允許親緣進(jìn)程間的通訊。命名管道(FIFO)除了親緣進(jìn)程可以通訊外,非親緣進(jìn)程也可以通訊。共享內(nèi)存多個(gè)進(jìn)程可以訪問(wèn)同一塊內(nèi)存空間,是最快的IPC方式。在進(jìn)程間傳遞數(shù)據(jù)時(shí)無(wú)須任何內(nèi)存的拷貝??梢栽谟H緣和非親緣的進(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í),從管道的頭開(kāi)始讀取。5進(jìn)程間通訊–pipe函數(shù)管道是由調(diào)用pipe函數(shù)而創(chuàng)建的。#include<unistd.h>intpipe(intfiledes[2]);參數(shù)filedes返回兩個(gè)文件描述符:filedes[0]為讀而打開(kāi),filedes[1]為寫而打開(kāi)。filedes[1]的輸出是filedes[0]的輸入。由于管道是單向的,所以通常一個(gè)進(jìn)程需要關(guān)閉寫端或者讀端,而另一個(gè)進(jìn)程則關(guān)閉相應(yīng)的讀端或?qū)懚?。寫端不存在時(shí),讀端會(huì)收到文件結(jié)束符。讀端不存在時(shí),寫端會(huì)收到SIGPIPE信號(hào)。如果忽略該信號(hào)或者捕捉該信號(hào)并從其處理程序返回,則write出錯(cuò)返回,errno設(shè)置為EPIPE成功返回0,失敗返回-1.缺點(diǎn):只能用于親緣進(jìn)程間通訊,在一個(gè)進(jìn)程內(nèi)管道幾乎是沒(méi)有實(shí)際用處的在寫管道時(shí),常數(shù)PIPE_BUF規(guī)定了內(nèi)核中管道緩存器的大小。如果對(duì)管道進(jìn)行write調(diào)用,而且要求寫的字節(jié)數(shù)小于等于PIPE_BUF,則此操作不會(huì)與其他進(jìn)程對(duì)同一管道(或FIFO)的write操作穿插進(jìn)行。但是,若有多個(gè)進(jìn)程同時(shí)寫一個(gè)管道(或FIFO),而且某個(gè)或某些進(jìn)程要求寫的字節(jié)數(shù)超過(guò)PIPE_BUF字節(jié)數(shù),則數(shù)據(jù)可能會(huì)與其他寫操作的數(shù)據(jù)相穿插。6進(jìn)程間通訊–fork前后管道關(guān)系fork之后做什么取決于我們想要有的數(shù)據(jù)流的方向。對(duì)于從父進(jìn)程到子進(jìn)程的管道,父進(jìn)程關(guān)閉管道的讀端(fd[0]),子進(jìn)程則關(guān)閉寫端(fd[1])Fork后的半雙工管道從父進(jìn)程到子進(jìn)程的管道對(duì)于從子進(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庫(kù)為實(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)建了管道。但是,通過(guò)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ī)格說(shuō)明與open函數(shù)中的mode相同。一旦已經(jīng)用mkfifo創(chuàng)建了一個(gè)FIFO,就可用open打開(kāi)它。確實(shí),一般的文件I/O函數(shù)(open、close、read、write、unlink等)都可用于FIFO。FIFO有兩種用途:(1)FIFO由shell命令使用以便將數(shù)據(jù)從一條管道線傳送到另一條,為此無(wú)需創(chuàng)建中間臨時(shí)文件。(2)FIFO用于客戶機(jī)-服務(wù)器應(yīng)用程序中,以在客戶機(jī)和服務(wù)器之間傳遞數(shù)據(jù)9進(jìn)程間通訊–FIFO當(dāng)打開(kāi)一個(gè)FIFO時(shí),非阻塞標(biāo)志(O_NONBLOCK)產(chǎn)生下列影響:(1)在一般情況中(沒(méi)有說(shuō)明O_NONBLOCK),只讀打開(kāi)要阻塞到某個(gè)其他進(jìn)程為寫打開(kāi)此FIFO。類似,為寫而打開(kāi)一個(gè)FIFO要阻塞到某個(gè)其他進(jìn)程為讀而打開(kāi)它。(2)如果指定了O_NONBLOCK,則只讀打開(kāi)立即返回。但是,如果沒(méi)有進(jìn)程已經(jīng)為讀而打開(kāi)一個(gè)FIFO,那么只寫打開(kāi)將出錯(cuò)返回,其errno是ENXIO。類似于管道,若寫一個(gè)尚無(wú)進(jìn)程為讀而打開(kāi)的FIFO,則產(chǎn)生信號(hào)SIGPIPE。若某個(gè)FIFO的最后一個(gè)寫進(jìn)程關(guān)閉了該FIFO,則將為該FIFO的讀進(jìn)程產(chǎn)生一個(gè)文件結(jié)束標(biāo)志。一個(gè)給定的FIFO有多個(gè)寫進(jìn)程是常見(jiàn)的。這就意味著如果不希望多個(gè)進(jìn)程所寫的數(shù)據(jù)互相穿插,則需考慮原子寫操作。正如對(duì)于管道一樣,常數(shù)PIPE_BUF說(shuō)明了可被原子寫到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)程之間對(duì)一給定存儲(chǔ)區(qū)的同步存取。若服務(wù)器將數(shù)據(jù)放入共享存儲(chǔ)區(qū),則在服務(wù)器做完這一操作之前,客戶機(jī)不應(yīng)當(dāng)去取這些數(shù)據(jù)。通常,信號(hào)量被用來(lái)實(shí)現(xiàn)對(duì)共享存儲(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)存的長(zhǎng)度。prot指明了共享內(nèi)存保護(hù)狀態(tài):PROT_EXEC,PROT_READ,PROT_WRITE,PROT_NONEflagsMAP_SHARED共享此內(nèi)存MAP_PRIVATE只有該進(jìn)程可見(jiàn)。MAP_ANONYMOUS為匿名映射。參數(shù)fd為即將映射到進(jìn)程空間的文件描述字,一般由open()返回,同時(shí),fd可以指定為-1,此時(shí)須指定flags參數(shù)中的MAP_ANON,表明進(jìn)行的是匿名映射(不涉及具體的文件名,避免了文件的創(chuàng)建及打開(kāi),很顯然只能用于具有親緣關(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ù)用來(lái)標(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中指明訪問(wèn)權(quán)限,跟open的mode參數(shù)一樣。否則會(huì)出現(xiàn)permissiondenied等錯(cuò)誤。返回:若成功則為共享內(nèi)存ID,若出錯(cuò)則為-1key可由ftok()生成。pathname必須為調(diào)用進(jìn)程可以訪問(wè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,并且沒(méi)有指定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ù)對(duì)共享存儲(chǔ)段執(zhí)行多種操作。intshmctl(intshmid,intcmd,structshmid_ds*buf);cmd參數(shù)指定下列5種命令中一種,使其在shmid指定的段上執(zhí)行:IPC_STAT對(duì)此段取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)程;另一種是具有超級(jí)用戶特權(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)程;另一種是具有超級(jí)用戶特權(quán)的進(jìn)程。SHM_LOCK

鎖住共享存儲(chǔ)段。此命令只能由超級(jí)用戶執(zhí)行。(禁止換出)SHM_UNLOCK解鎖共享存儲(chǔ)段。此命令只能由超級(jí)用戶執(zhí)行。返回:若成功則為0,若出錯(cuò)則為-117進(jìn)程間通訊–shmdt當(dāng)對(duì)共享存儲(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ù)信號(hào)量信號(hào)量是一個(gè)計(jì)數(shù)器,用于多進(jìn)程對(duì)共享數(shù)據(jù)對(duì)象的存取訪問(wèn)控制。為了獲得共享資源,進(jìn)程需要執(zhí)行下列操作:(1)測(cè)試控制該資源的信號(hào)量。(2)若此信號(hào)量的值為正,則進(jìn)程可以使用該資源。進(jìn)程將信號(hào)量值減1,表示它使用了一個(gè)資源單位。(3)若此信號(hào)量的值為0,則進(jìn)程進(jìn)入睡眠狀態(tài),直至信號(hào)量值大于0。若進(jìn)程被喚醒后,它返回至(第(1)步)。18信號(hào)量intsemget(key_tkey,intnSemes,intflag)函數(shù)說(shuō)明:創(chuàng)建信號(hào)量,如果引用一個(gè)現(xiàn)存的集合(一個(gè)客戶機(jī)),則將nsems指定為0參數(shù)說(shuō)明:key-標(biāo)識(shí)信號(hào)量的關(guān)鍵字,有三種方法:1、使用IPC-PRIVATE讓系統(tǒng)產(chǎn)生,2、挑選一個(gè)隨機(jī)數(shù),3、使用ftok從文件路徑名中產(chǎn)生nSemes-信號(hào)量集中元素個(gè)數(shù),對(duì)客戶機(jī),此參數(shù)設(shè)為0Flag-IPC_CREAT;IPC_EXCL只有在信號(hào)量集不存在時(shí)創(chuàng)建,對(duì)客戶機(jī),此參數(shù)設(shè)為019信號(hào)量intsemctl(intsemid,intsemnum,intcmd,/*unionsenumarg*/...)函數(shù)說(shuō)明:

控制信號(hào)量參數(shù)說(shuō)明:

semid-信號(hào)量集的句柄semnum-信號(hào)量集的某個(gè)成員cmd-命令I(lǐng)PC_RMID刪除一個(gè)信號(hào)量IPC_SET設(shè)置信號(hào)量的許可權(quán)

SETVAL

設(shè)置指定信號(hào)量的元素的值為agc.val

GETVAL

獲得一個(gè)指定信號(hào)量的值

GETPID獲得最后操縱此元素的最后進(jìn)程ID

GETNCNT

獲得等待元素變?yōu)?的進(jìn)程數(shù)

GETZCNT

獲得等待元素變?yōu)?的進(jìn)程數(shù)20信號(hào)量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信號(hào)量intsemop(intsemid,struct

sembuf*sops,unsigned

shortnsops)函數(shù)說(shuō)明:對(duì)信號(hào)量+1或-1或測(cè)試是否為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信號(hào)量(1)最易于處理的情況是sem_op為正。這對(duì)應(yīng)于返回進(jìn)程占用的資源。sem_op值加到信號(hào)量的值上。如果指定了SEM_UNDO標(biāo)志,則當(dāng)該進(jìn)程終止的時(shí)候會(huì)自動(dòng)將信號(hào)量的值恢復(fù)回之前的值。(2)若sem_op為負(fù),則表示要獲取由該信號(hào)量控制的資源。如若該信號(hào)量的值大于或等于sem_op的絕對(duì)值(具有所需的資源),則從信號(hào)量值中減去sem_op的絕對(duì)值。這保證信號(hào)量的結(jié)果值大于或等于0。如果指定了undo標(biāo)志,則sem_op的絕對(duì)值也加到該進(jìn)程的此信號(hào)量調(diào)整值上。如果信號(hào)量值小于sem_op的絕對(duì)值(資源不能滿足要求),則:(a)若指定了IPC_NOWAIT,則出錯(cuò)返回EAGAIN;(b)若未指定IPC_NOWAIT,則該信號(hào)量的semncnt值加1(因?yàn)閷⑦M(jìn)入睡眠狀態(tài)),然后調(diào)用進(jìn)程被掛起直至下列事件之一發(fā)生:i.此信號(hào)量變成大于或等于sem_op的絕對(duì)值(即某個(gè)進(jìn)程已釋放了某些資源)。此信號(hào)量的semncnt值減1(因?yàn)橐呀Y(jié)束等待),并且從信號(hào)量值中減去sem_op的絕對(duì)值。如果指定了undo標(biāo)志,則sem_op的絕對(duì)值也加到該進(jìn)程的此信號(hào)量調(diào)整值上。ii.從系統(tǒng)中刪除了此信號(hào)量。在此情況下,函數(shù)出錯(cuò)返回ERMID。24信號(hào)量iii.進(jìn)程捕捉到一個(gè)信號(hào),并從信號(hào)處理程序返回,在此情況下,此信號(hào)量的semncnt值減1(因?yàn)椴辉俚却?,并且函?shù)出錯(cuò)返回EINTR.(3)若sem_op為0,這表示希望等待到該信號(hào)量值變成0。如果信號(hào)量值當(dāng)前是0,則此函數(shù)立即返回。如果信號(hào)量值非0,則:(a)若指定了IPC_NOWAIT,則

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論