版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
LINUX應用編程–
進程間通訊2009年12月22日2LINUX應用編程-目錄IPC概述管道FIFO共享存儲套接字信號量消息隊列3進程間通訊–IPC概述信號(signal)親緣進程和非親緣進程都可以,也可以進程自己給自己遞送信號。信號量(semaphore)主要是線程間和親緣和非親緣的進程間的同步手段,不做數據傳輸之用。管道只允許親緣進程間的通訊。命名管道(FIFO)除了親緣進程可以通訊外,非親緣進程也可以通訊。共享內存多個進程可以訪問同一塊內存空間,是最快的IPC方式。在進程間傳遞數據時無須任何內存的拷貝??梢栽谟H緣和非親緣的進程間使用。套接字最通用的進程間通訊方式,它提供了一種讓不同機器上進程間通訊方式。消息隊列可以用在非親緣關系的進程之間使用4進程間通訊–
管道管道是UNIXIPC的最老形式,并且所有UNIX系統都提供此種通信機制,管道有兩種限制;(1)它們是半雙工的。數據只能在一個方向上流動。(2)它們只能在具有公共祖先的進程之間使用。通常,一個管道由一個進程創(chuàng)建,然后該進程調用fork,此后父、子進程之間就可應用該管道。管道的寫和讀有兩個特性:(1)數據寫入時,放在管道的結尾。(2)數據讀取時,從管道的頭開始讀取。5進程間通訊–pipe函數管道是由調用pipe函數而創(chuàng)建的。#include<unistd.h>intpipe(intfiledes[2]);參數filedes返回兩個文件描述符:filedes[0]為讀而打開,filedes[1]為寫而打開。filedes[1]的輸出是filedes[0]的輸入。由于管道是單向的,所以通常一個進程需要關閉寫端或者讀端,而另一個進程則關閉相應的讀端或寫端。寫端不存在時,讀端會收到文件結束符。讀端不存在時,寫端會收到SIGPIPE信號。如果忽略該信號或者捕捉該信號并從其處理程序返回,則write出錯返回,errno設置為EPIPE成功返回0,失敗返回-1.缺點:只能用于親緣進程間通訊,在一個進程內管道幾乎是沒有實際用處的在寫管道時,常數PIPE_BUF規(guī)定了內核中管道緩存器的大小。如果對管道進行write調用,而且要求寫的字節(jié)數小于等于PIPE_BUF,則此操作不會與其他進程對同一管道(或FIFO)的write操作穿插進行。但是,若有多個進程同時寫一個管道(或FIFO),而且某個或某些進程要求寫的字節(jié)數超過PIPE_BUF字節(jié)數,則數據可能會與其他寫操作的數據相穿插。6進程間通訊–fork前后管道關系fork之后做什么取決于我們想要有的數據流的方向。對于從父進程到子進程的管道,父進程關閉管道的讀端(fd[0]),子進程則關閉寫端(fd[1])Fork后的半雙工管道從父進程到子進程的管道對于從子進程到父進程的管道,父進程關閉fd[1],子進程關閉fd[0]7進程間通訊–popen和pclose函數我們常用到的一個操作是創(chuàng)建一個連接到另一個進程的管道,然后讀其輸出或向其發(fā)送輸入,所以標準I/O庫為實現這些操作提供了兩個函數popen和pclose。這兩個函數實現的操作是:創(chuàng)建一個管道,fork一個子進程,關閉管道的不使用端,exec一個shell以執(zhí)行命令,等待命令終止。#include<stdio.h>FILE*popen(constchar*command,constchar*type);返回:若成功則為文件指針,若出錯則為NULLintpclose(FILE*stream);返回:command的終止狀態(tài),若出錯則為-1函數popen先執(zhí)行fork,然后調用exec以執(zhí)行command,并且返回一個標準I/O文件指針。如果type是"r",則文件指針連接到command的標準輸出。如果type是“w”,則文件指針連接到command的標準輸入。pclose函數關閉標準I/O流,等待命令執(zhí)行結束,然后返回shell的終止狀態(tài)。如果shell不能被執(zhí)行,則pclose返回的終止狀態(tài)與shell執(zhí)行exit一樣。8進程間通訊–FIFOFIFO有時被稱為命名管道。管道只能由相關進程使用,它們共同的祖先進程創(chuàng)建了管道。但是,通過FIFO,不相關的進程也能交換數據。創(chuàng)建FIFO類似于創(chuàng)建文件。確實,FIFO的路徑名存在于文件系統中。#include<sys/types.h>#include<sys/stat.h>intmkfifo(constchar*pathname,mode_tmode);返回0成功,返回-1失敗mkfifo函數中mode參數的規(guī)格說明與open函數中的mode相同。一旦已經用mkfifo創(chuàng)建了一個FIFO,就可用open打開它。確實,一般的文件I/O函數(open、close、read、write、unlink等)都可用于FIFO。FIFO有兩種用途:(1)FIFO由shell命令使用以便將數據從一條管道線傳送到另一條,為此無需創(chuàng)建中間臨時文件。(2)FIFO用于客戶機-服務器應用程序中,以在客戶機和服務器之間傳遞數據9進程間通訊–FIFO當打開一個FIFO時,非阻塞標志(O_NONBLOCK)產生下列影響:(1)在一般情況中(沒有說明O_NONBLOCK),只讀打開要阻塞到某個其他進程為寫打開此FIFO。類似,為寫而打開一個FIFO要阻塞到某個其他進程為讀而打開它。(2)如果指定了O_NONBLOCK,則只讀打開立即返回。但是,如果沒有進程已經為讀而打開一個FIFO,那么只寫打開將出錯返回,其errno是ENXIO。類似于管道,若寫一個尚無進程為讀而打開的FIFO,則產生信號SIGPIPE。若某個FIFO的最后一個寫進程關閉了該FIFO,則將為該FIFO的讀進程產生一個文件結束標志。一個給定的FIFO有多個寫進程是常見的。這就意味著如果不希望多個進程所寫的數據互相穿插,則需考慮原子寫操作。正如對于管道一樣,常數PIPE_BUF說明了可被原子寫到FIFO的最大數據量。10進程間通訊–
共享存儲共享存儲允許兩個或多個進程共享一給定的存儲區(qū)。因為數據不需要在客戶機和服務器之間復制,所以這是最快的一種IPC。使用共享存儲的唯一竅門是多個進程之間對一給定存儲區(qū)的同步存取。若服務器將數據放入共享存儲區(qū),則在服務器做完這一操作之前,客戶機不應當去取這些數據。通常,信號量被用來實現對共享存儲存取的同步。11進程間通訊–mmapvoid*mmap(void*addr,size_tlength,intprot,intflags,intfd,off_toffset)mmap在進程地址空間創(chuàng)建一個映射。它既可以把一個文件映射到內存,也可以映射一塊內存,實現進程間內存共享。addr為共享內存的起始地址,為NULL時,內核會自動選擇一個起始地址。length為共享內存的長度。prot指明了共享內存保護狀態(tài):PROT_EXEC,PROT_READ,PROT_WRITE,PROT_NONEflagsMAP_SHARED共享此內存MAP_PRIVATE只有該進程可見。MAP_ANONYMOUS為匿名映射。參數fd為即將映射到進程空間的文件描述字,一般由open()返回,同時,fd可以指定為-1,此時須指定flags參數中的MAP_ANON,表明進行的是匿名映射(不涉及具體的文件名,避免了文件的創(chuàng)建及打開,很顯然只能用于具有親緣關系的進程間通信)。12進程間通訊–
內存共享內核為每個共享存儲段設置了一個shmid_ds結構。#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);共享內存1314進程間通訊–shmget函數調用的第一個函數通常是shmget,它獲得一個指定大小的共享存儲標識符。intshmget(key_tkey,size_tsize,intshmflg);key參數用來標識共享內存size參數該共享存儲段的最小值,如果正在創(chuàng)建一個新段(一般在服務器中),則必須指定其size。如果正在存訪一個現存的段(一個客戶機),則將size指定為0。shmflg參數有IPC_CREAT和IPC_EXCL,最為重要的是在shmflg中指明訪問權限,跟open的mode參數一樣。否則會出現permissiondenied等錯誤。返回:若成功則為共享內存ID,若出錯則為-1key可由ftok()生成。pathname必須為調用進程可以訪問的。proj_id的低8bit有效。pathname和proj_id共同組成一個key。15進程間通訊–shmat一旦創(chuàng)建了一個共享存儲段,進程就可調用shmat將其連接到它的地址空間中。void*shmat(intshmid,constvoid*addr,intshmflg);返回:若成功則為指向共享存儲段的指針,若出錯則為-1共享存儲段連接到調用進程的哪個地址上與addr參數以及在flag中是否指定SHM_RND位有關。(1)如果addr為NULL,則此段連接到由內核選擇的第一個可用地址上。(2)如果addr非NULL,并且沒有指定SHM_RND,則此段連接到addr所指定的地址上。(3)如果addr非0,并且指定了SHM_RND,則此段連接到(addr-(addrmodSHMLBA))所表示的地址上。SHM_RND命令的意思是:取整。SHM_LBA的意思是:低邊界地址倍數,它總是2的乘方。該算式是將地址向下取最近1個SHMLBA的倍數。一般應指定addr為0,以便由內核選擇地址。16進程間通訊–shmctlshmctl函數對共享存儲段執(zhí)行多種操作。intshmctl(intshmid,intcmd,structshmid_ds*buf);cmd參數指定下列5種命令中一種,使其在shmid指定的段上執(zhí)行:IPC_STAT對此段取shmid_ds結構,并存放在由buf指向的結構中。IPC_SET按buf指向的結構中的值設置與此段相關結構中的下列三個字段:shm_perm.uid、shm_perm.gid以及shm_perm.mode。此命令只能由下列兩種進程執(zhí)行:一種是其有效用戶ID等于shm_perm.cuid或shm_perm.uid的進程;另一種是具有超級用戶特權的進程。
IPC_RMID從系統中刪除該共享存儲段。因為每個共享存儲段有一個連接計數(shm_nattch在shmid_ds結構中),所以除非使用該段的最后一個進程終止或與該段脫接,否則不會實際上刪除該存儲段。不管此段是否仍在使用,該段標識符立即被刪除,所以不能再用shmat與該段連接。此命令只能由下列兩種進程執(zhí)行:一種是其有效用戶ID等于shm_perm.cuid或shm_perm.uid的進程;另一種是具有超級用戶特權的進程。SHM_LOCK
鎖住共享存儲段。此命令只能由超級用戶執(zhí)行。(禁止換出)SHM_UNLOCK解鎖共享存儲段。此命令只能由超級用戶執(zhí)行。返回:若成功則為0,若出錯則為-117進程間通訊–shmdt當對共享存儲段的操作已經結束時,則調用shmdt脫接該段。注意,這并不從系統中刪除其標識符以及其數據結構。該標識符仍然存在,直至某個進程(一般是服務器)調用shmctl(帶命令IPC_RMID)特地刪除它。intshmdt(constvoid*shmaddr);shmaddr參數是以前調用shmat時的返回值。返回:若成功則為0,若出錯則為-1Shmex.c例子展示了在親緣關系的進程中內存共享wshm.c例子往一片共享內存內寫入數據,而rshm.c則從該共享內存中讀取數據信號量信號量是一個計數器,用于多進程對共享數據對象的存取訪問控制。為了獲得共享資源,進程需要執(zhí)行下列操作:(1)測試控制該資源的信號量。(2)若此信號量的值為正,則進程可以使用該資源。進程將信號量值減1,表示它使用了一個資源單位。(3)若此信號量的值為0,則進程進入睡眠狀態(tài),直至信號量值大于0。若進程被喚醒后,它返回至(第(1)步)。18信號量intsemget(key_tkey,intnSemes,intflag)函數說明:創(chuàng)建信號量,如果引用一個現存的集合(一個客戶機),則將nsems指定為0參數說明:key-標識信號量的關鍵字,有三種方法:1、使用IPC-PRIVATE讓系統產生,2、挑選一個隨機數,3、使用ftok從文件路徑名中產生nSemes-信號量集中元素個數,對客戶機,此參數設為0Flag-IPC_CREAT;IPC_EXCL只有在信號量集不存在時創(chuàng)建,對客戶機,此參數設為019信號量intsemctl(intsemid,intsemnum,intcmd,/*unionsenumarg*/...)函數說明:
控制信號量參數說明:
semid-信號量集的句柄semnum-信號量集的某個成員cmd-命令IPC_RMID刪除一個信號量IPC_SET設置信號量的許可權
SETVAL
設置指定信號量的元素的值為agc.val
GETVAL
獲得一個指定信號量的值
GETPID獲得最后操縱此元素的最后進程ID
GETNCNT
獲得等待元素變?yōu)?的進程數
GETZCNT
獲得等待元素變?yōu)?的進程數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)函數說明:對信號量+1或-1或測試是否為0函數參數:semid–sops-指向元素操作數組
structsembuf{
shortintsem_num;//semaphorenumber
shortintsem_op;//semaphoreoperaion,0,+1,-1
shortintsem_flg;//operationflagSEM_UNDO,IPC_NOWAIT};nsops-數組中元素操作的個數2223信號量(1)最易于處理的情況是sem_op為正。這對應于返回進程占用的資源。sem_op值加到信號量的值上。如果指定了SEM_UNDO標志,則當該進程終止的時候會自動將信號量的值恢復回之前的值。(2)若sem_op為負,則表示要獲取由該信號量控制的資源。如若該信號量的值大于或等于sem_op的絕對值(具有所需的資源),則從信號量值中減去sem_op的絕對值。這保證信號量的結果值大于或等于0。如果指定了undo標志,則sem_op的絕對值也加到該進程的此信號量調整值上。如果信號量值小于sem_op的絕對值(資源不能滿足要求),則:(a)若指定了IPC_NOWAIT,則出錯返回EAGAIN;(b)若未指定IPC_NOWAIT,則該信號量的semncnt值加1(因為將進入睡眠狀態(tài)),然后調用進程被掛起直至下列事件之一發(fā)生:i.此信號量變成大于或等于sem_op的絕對值(即某個進程已釋放了某些資源)。此信號量的semncnt值減1(因為已結束等待),并且從信號量值中減去sem_op的絕對值。如果指定了undo標志,則sem_op的絕對值也加到該進程的此信號量調整值上。ii.從系統中刪除了此信號量。在此情況下,函數出錯返回ERMID。24信號量iii.進程捕捉到一個信號,并從信號處理程序返回,在此情況下,此信號量的semncnt值減1(因為不再等待),并且函數出錯返回EINTR.(3)若sem_op為0,這表示希望等待到該信號量值變成0。如果信號量值當前是0,則此函數立即返回。如果信號量值非0,則:(a)若指定了IPC_NOWAIT,則
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單位管理制度合并選集【人力資源管理篇】十篇
- 寒假自習課 25春初中道德與法治八年級下冊教學課件 第三單元 第五課 第3課時 基本經濟制度
- 《員工考績計算》課件
- 2013年高考語文試卷(福建)(空白卷)
- 《種植業(yè)生態(tài)工程》課件
- 《小學美術說課》課件
- 《電腦硬件知識講解》課件
- 液態(tài)奶冷鏈物流優(yōu)化-洞察分析
- 稅收風險管理工具-洞察分析
- 系統負載均衡方法-洞察分析
- 2025年初級會計職稱《經濟法基礎》全真模擬及答案(解析3套)
- 浙江省金華市金東區(qū)2023-2024學年九年級上學期語文期末試卷
- 【7地星球期末】安徽省合肥市包河區(qū)智育聯盟校2023-2024學年七年級上學期期末地理試題(含解析)
- ISO 56001-2024《創(chuàng)新管理體系-要求》專業(yè)解讀與應用實踐指導材料之2:“1至3章:范圍、術語和定義”(雷澤佳編制-2025B0)
- (2021)最高法民申5114號凱某建設工程合同糾紛案 指導
- 【9物(人)期末】安慶市宿松縣2023-2024學年九年級上學期期末考試物理試題
- 導航通信一體化考核試卷
- 尊重學術道德遵守學術規(guī)范學習通超星期末考試答案章節(jié)答案2024年
- 2024年四川省成都市青羊區(qū)數學六上期末考試試題含解析
- 望廬山瀑布李白
- 斜盤式軸向柱塞泵設計說明書
評論
0/150
提交評論