版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
LINUX應(yīng)用編程–
進(jìn)程間通訊2009年12月22日2LINUX應(yīng)用編程-目錄IPC概述管道FIFO共享存儲套接字信號量消息隊列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)存多個進(jìn)程可以訪問同一塊內(nèi)存空間,是最快的IPC方式。在進(jìn)程間傳遞數(shù)據(jù)時無須任何內(nèi)存的拷貝??梢栽谟H緣和非親緣的進(jìn)程間使用。套接字最通用的進(jìn)程間通訊方式,它提供了一種讓不同機(jī)器上進(jìn)程間通訊方式。消息隊列可以用在非親緣關(guān)系的進(jìn)程之間使用4進(jìn)程間通訊–
管道管道是UNIXIPC的最老形式,并且所有UNIX系統(tǒng)都提供此種通信機(jī)制,管道有兩種限制;(1)它們是半雙工的。數(shù)據(jù)只能在一個方向上流動。(2)它們只能在具有公共祖先的進(jìn)程之間使用。通常,一個管道由一個進(jìn)程創(chuàng)建,然后該進(jìn)程調(diào)用fork,此后父、子進(jìn)程之間就可應(yīng)用該管道。管道的寫和讀有兩個特性:(1)數(shù)據(jù)寫入時,放在管道的結(jié)尾。(2)數(shù)據(jù)讀取時,從管道的頭開始讀取。5進(jìn)程間通訊–pipe函數(shù)管道是由調(diào)用pipe函數(shù)而創(chuàng)建的。#include<unistd.h>intpipe(intfiledes[2]);參數(shù)filedes返回兩個文件描述符:filedes[0]為讀而打開,filedes[1]為寫而打開。filedes[1]的輸出是filedes[0]的輸入。由于管道是單向的,所以通常一個進(jìn)程需要關(guān)閉寫端或者讀端,而另一個進(jìn)程則關(guān)閉相應(yīng)的讀端或?qū)懚?。寫端不存在時,讀端會收到文件結(jié)束符。讀端不存在時,寫端會收到SIGPIPE信號。如果忽略該信號或者捕捉該信號并從其處理程序返回,則write出錯返回,errno設(shè)置為EPIPE成功返回0,失敗返回-1.缺點(diǎn):只能用于親緣進(jìn)程間通訊,在一個進(jìn)程內(nèi)管道幾乎是沒有實(shí)際用處的在寫管道時,常數(shù)PIPE_BUF規(guī)定了內(nèi)核中管道緩存器的大小。如果對管道進(jìn)行write調(diào)用,而且要求寫的字節(jié)數(shù)小于等于PIPE_BUF,則此操作不會與其他進(jìn)程對同一管道(或FIFO)的write操作穿插進(jìn)行。但是,若有多個進(jìn)程同時寫一個管道(或FIFO),而且某個或某些進(jìn)程要求寫的字節(jié)數(shù)超過PIPE_BUF字節(jié)數(shù),則數(shù)據(jù)可能會與其他寫操作的數(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ù)我們常用到的一個操作是創(chuàng)建一個連接到另一個進(jìn)程的管道,然后讀其輸出或向其發(fā)送輸入,所以標(biāo)準(zhǔn)I/O庫為實(shí)現(xiàn)這些操作提供了兩個函數(shù)popen和pclose。這兩個函數(shù)實(shí)現(xiàn)的操作是:創(chuàng)建一個管道,fork一個子進(jìn)程,關(guān)閉管道的不使用端,exec一個shell以執(zhí)行命令,等待命令終止。#include<stdio.h>FILE*popen(constchar*command,constchar*type);返回:若成功則為文件指針,若出錯則為NULLintpclose(FILE*stream);返回:command的終止?fàn)顟B(tài),若出錯則為-1函數(shù)popen先執(zhí)行fork,然后調(diào)用exec以執(zhí)行command,并且返回一個標(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有時被稱為命名管道。管道只能由相關(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)建了一個FIFO,就可用open打開它。確實(shí),一般的文件I/O函數(shù)(open、close、read、write、unlink等)都可用于FIFO。FIFO有兩種用途:(1)FIFO由shell命令使用以便將數(shù)據(jù)從一條管道線傳送到另一條,為此無需創(chuàng)建中間臨時文件。(2)FIFO用于客戶機(jī)-服務(wù)器應(yīng)用程序中,以在客戶機(jī)和服務(wù)器之間傳遞數(shù)據(jù)9進(jìn)程間通訊–FIFO當(dāng)打開一個FIFO時,非阻塞標(biāo)志(O_NONBLOCK)產(chǎn)生下列影響:(1)在一般情況中(沒有說明O_NONBLOCK),只讀打開要阻塞到某個其他進(jìn)程為寫打開此FIFO。類似,為寫而打開一個FIFO要阻塞到某個其他進(jìn)程為讀而打開它。(2)如果指定了O_NONBLOCK,則只讀打開立即返回。但是,如果沒有進(jìn)程已經(jīng)為讀而打開一個FIFO,那么只寫打開將出錯返回,其errno是ENXIO。類似于管道,若寫一個尚無進(jìn)程為讀而打開的FIFO,則產(chǎn)生信號SIGPIPE。若某個FIFO的最后一個寫進(jìn)程關(guān)閉了該FIFO,則將為該FIFO的讀進(jìn)程產(chǎn)生一個文件結(jié)束標(biāo)志。一個給定的FIFO有多個寫進(jìn)程是常見的。這就意味著如果不希望多個進(jìn)程所寫的數(shù)據(jù)互相穿插,則需考慮原子寫操作。正如對于管道一樣,常數(shù)PIPE_BUF說明了可被原子寫到FIFO的最大數(shù)據(jù)量。10進(jìn)程間通訊–
共享存儲共享存儲允許兩個或多個進(jìn)程共享一給定的存儲區(qū)。因?yàn)閿?shù)據(jù)不需要在客戶機(jī)和服務(wù)器之間復(fù)制,所以這是最快的一種IPC。使用共享存儲的唯一竅門是多個進(jìn)程之間對一給定存儲區(qū)的同步存取。若服務(wù)器將數(shù)據(jù)放入共享存儲區(qū),則在服務(wù)器做完這一操作之前,客戶機(jī)不應(yīng)當(dāng)去取這些數(shù)據(jù)。通常,信號量被用來實(shí)現(xiàn)對共享存儲存取的同步。11進(jìn)程間通訊–mmapvoid*mmap(void*addr,size_tlength,intprot,intflags,intfd,off_toffset)mmap在進(jìn)程地址空間創(chuàng)建一個映射。它既可以把一個文件映射到內(nèi)存,也可以映射一塊內(nèi)存,實(shí)現(xiàn)進(jìn)程間內(nèi)存共享。addr為共享內(nèi)存的起始地址,為NULL時,內(nèi)核會自動選擇一個起始地址。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()返回,同時,fd可以指定為-1,此時須指定flags參數(shù)中的MAP_ANON,表明進(jìn)行的是匿名映射(不涉及具體的文件名,避免了文件的創(chuàng)建及打開,很顯然只能用于具有親緣關(guān)系的進(jìn)程間通信)。12進(jìn)程間通訊–
內(nèi)存共享內(nèi)核為每個共享存儲段設(shè)置了一個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)用的第一個函數(shù)通常是shmget,它獲得一個指定大小的共享存儲標(biāo)識符。intshmget(key_tkey,size_tsize,intshmflg);key參數(shù)用來標(biāo)識共享內(nèi)存size參數(shù)該共享存儲段的最小值,如果正在創(chuàng)建一個新段(一般在服務(wù)器中),則必須指定其size。如果正在存訪一個現(xiàn)存的段(一個客戶機(jī)),則將size指定為0。shmflg參數(shù)有IPC_CREAT和IPC_EXCL,最為重要的是在shmflg中指明訪問權(quán)限,跟open的mode參數(shù)一樣。否則會出現(xiàn)permissiondenied等錯誤。返回:若成功則為共享內(nèi)存ID,若出錯則為-1key可由ftok()生成。pathname必須為調(diào)用進(jìn)程可以訪問的。proj_id的低8bit有效。pathname和proj_id共同組成一個key。15進(jìn)程間通訊–shmat一旦創(chuàng)建了一個共享存儲段,進(jìn)程就可調(diào)用shmat將其連接到它的地址空間中。void*shmat(intshmid,constvoid*addr,intshmflg);返回:若成功則為指向共享存儲段的指針,若出錯則為-1共享存儲段連接到調(diào)用進(jìn)程的哪個地址上與addr參數(shù)以及在flag中是否指定SHM_RND位有關(guān)。(1)如果addr為NULL,則此段連接到由內(nèi)核選擇的第一個可用地址上。(2)如果addr非NULL,并且沒有指定SHM_RND,則此段連接到addr所指定的地址上。(3)如果addr非0,并且指定了SHM_RND,則此段連接到(addr-(addrmodSHMLBA))所表示的地址上。SHM_RND命令的意思是:取整。SHM_LBA的意思是:低邊界地址倍數(shù),它總是2的乘方。該算式是將地址向下取最近1個SHMLBA的倍數(shù)。一般應(yīng)指定addr為0,以便由內(nèi)核選擇地址。16進(jìn)程間通訊–shmctlshmctl函數(shù)對共享存儲段執(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)中的下列三個字段: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)中刪除該共享存儲段。因?yàn)槊總€共享存儲段有一個連接計數(shù)(shm_nattch在shmid_ds結(jié)構(gòu)中),所以除非使用該段的最后一個進(jìn)程終止或與該段脫接,否則不會實(shí)際上刪除該存儲段。不管此段是否仍在使用,該段標(biāo)識符立即被刪除,所以不能再用shmat與該段連接。此命令只能由下列兩種進(jìn)程執(zhí)行:一種是其有效用戶ID等于shm_perm.cuid或shm_perm.uid的進(jìn)程;另一種是具有超級用戶特權(quán)的進(jìn)程。SHM_LOCK
鎖住共享存儲段。此命令只能由超級用戶執(zhí)行。(禁止換出)SHM_UNLOCK解鎖共享存儲段。此命令只能由超級用戶執(zhí)行。返回:若成功則為0,若出錯則為-117進(jìn)程間通訊–shmdt當(dāng)對共享存儲段的操作已經(jīng)結(jié)束時,則調(diào)用shmdt脫接該段。注意,這并不從系統(tǒng)中刪除其標(biāo)識符以及其數(shù)據(jù)結(jié)構(gòu)。該標(biāo)識符仍然存在,直至某個進(jìn)程(一般是服務(wù)器)調(diào)用shmctl(帶命令I(lǐng)PC_RMID)特地刪除它。intshmdt(constvoid*shmaddr);shmaddr參數(shù)是以前調(diào)用shmat時的返回值。返回:若成功則為0,若出錯則為-1Shmex.c例子展示了在親緣關(guān)系的進(jìn)程中內(nèi)存共享wshm.c例子往一片共享內(nèi)存內(nèi)寫入數(shù)據(jù),而rshm.c則從該共享內(nèi)存中讀取數(shù)據(jù)信號量信號量是一個計數(shù)器,用于多進(jìn)程對共享數(shù)據(jù)對象的存取訪問控制。為了獲得共享資源,進(jìn)程需要執(zhí)行下列操作:(1)測試控制該資源的信號量。(2)若此信號量的值為正,則進(jìn)程可以使用該資源。進(jìn)程將信號量值減1,表示它使用了一個資源單位。(3)若此信號量的值為0,則進(jìn)程進(jìn)入睡眠狀態(tài),直至信號量值大于0。若進(jìn)程被喚醒后,它返回至(第(1)步)。18信號量intsemget(key_tkey,intnSemes,intflag)函數(shù)說明:創(chuàng)建信號量,如果引用一個現(xiàn)存的集合(一個客戶機(jī)),則將nsems指定為0參數(shù)說明:key-標(biāo)識信號量的關(guān)鍵字,有三種方法:1、使用IPC-PRIVATE讓系統(tǒng)產(chǎn)生,2、挑選一個隨機(jī)數(shù),3、使用ftok從文件路徑名中產(chǎn)生nSemes-信號量集中元素個數(shù),對客戶機(jī),此參數(shù)設(shè)為0Flag-IPC_CREAT;IPC_EXCL只有在信號量集不存在時創(chuàng)建,對客戶機(jī),此參數(shù)設(shè)為019信號量intsemctl(intsemid,intsemnum,intcmd,/*unionsenumarg*/...)函數(shù)說明:
控制信號量參數(shù)說明:
semid-信號量集的句柄semnum-信號量集的某個成員cmd-命令I(lǐng)PC_RMID刪除一個信號量IPC_SET設(shè)置信號量的許可權(quán)
SETVAL
設(shè)置指定信號量的元素的值為agc.val
GETVAL
獲得一個指定信號量的值
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ù)組中元素操作的個數(shù)2223信號量(1)最易于處理的情況是sem_op為正。這對應(yīng)于返回進(jìn)程占用的資源。sem_op值加到信號量的值上。如果指定了SEM_UNDO標(biāo)志,則當(dāng)該進(jìn)程終止的時候會自動將信號量的值恢復(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,則出錯返回EAGAIN;(b)若未指定IPC_NOWAIT,則該信號量的semncnt值加1(因?yàn)閷⑦M(jìn)入睡眠狀態(tài)),然后調(diào)用進(jìn)程被掛起直至下列事件之一發(fā)生:i.此信號量變成大于或等于sem_op的絕對值(即某個進(jìn)程已釋放了某些資源)。此信號量的semncnt值減1(因?yàn)橐呀Y(jié)束等待),并且從信號量值中減去sem_op的絕對值。如果指定了undo標(biāo)志,則sem_op的絕對值也加到該進(jìn)程的此信號量調(diào)整值上。ii.從系統(tǒng)中刪除了此信號量。在此情況下,函數(shù)出錯返回ERMID。24信號量iii.進(jìn)程捕捉到一個信號,并從信號處理程序返回,在此情況下,此信號量的semncnt值減1(因?yàn)椴辉俚却?,并且函?shù)出錯返回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)容里面會有圖紙預(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 常州市溧陽中學(xué)高三地理一輪復(fù)習(xí)東北農(nóng)業(yè)作業(yè)
- 2025年高職化工裝備技術(shù)(化工設(shè)備維護(hù))試題及答案
- 2025年中職生命科學(xué)(生命現(xiàn)象基礎(chǔ))試題及答案
- 2025年高職審計(審計實(shí)務(wù))試題及答案
- 2025年高職(電力工程及自動化基礎(chǔ))電力系統(tǒng)運(yùn)維階段測試題及答案
- 2025年中職嬰幼兒早期指導(dǎo)(感官發(fā)育訓(xùn)練)試題及答案
- 大學(xué)(工程管理)項目進(jìn)度控制2026年綜合測試題及答案
- 2025年高職動物醫(yī)學(xué)(動物疫病防治)試題及答案
- 2025年高職皮革制品設(shè)計與工藝(皮具設(shè)計技術(shù))試題及答案
- 2025年中職林業(yè)病蟲害防治(林業(yè)病蟲害防治)試題及答案
- 2026年哈爾濱傳媒職業(yè)學(xué)院單招職業(yè)傾向性考試題庫附答案
- 水廠設(shè)備調(diào)試與試運(yùn)行方案詳解
- 2025年江蘇省鎮(zhèn)江市輔警協(xié)警筆試筆試真題(附答案)
- 工程力學(xué)(本)2024國開機(jī)考答案
- 公路工程設(shè)計工作總結(jié)報告(交工驗(yàn)收-設(shè)計單位)
- 三軸轉(zhuǎn)臺仿真設(shè)計設(shè)計說明書
- 2015年版干部履歷表
- 陶棍陶板考察報告
- q gw2sjss.65金風(fēng)風(fēng)力發(fā)電機(jī)組防腐技術(shù)rna部分歸檔版
- 陜西北元化工集團(tuán)有限公司 100 萬噸 - 年聚氯乙烯項目竣工驗(yàn)收監(jiān)測報告
- 向知識分子介紹佛教剖析
評論
0/150
提交評論