




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
進程間同步和通信xlanchen@2007.6.25xlanchen@2006.6.211EmbeddedOperatingSystems進程間通信IPC,Inter-ProcessCommunicationUnix系統(tǒng)提供的基本的IPC包括:1、管道和FIFO(有名管道)2、消息3、信號量4、共享內(nèi)存區(qū)5、套接字xlanchen@2006.6.212EmbeddedOperatingSystems1、管道(pipe)管道是所有Unix都提供的一種IPC機制管道是半雙工的,數(shù)據(jù)只能向一個方向流動;一個進程將數(shù)據(jù)寫入管道,
另一個進程從管道中讀取數(shù)據(jù)數(shù)據(jù)的讀出和寫入:
寫入的內(nèi)容每次都添加在管道緩沖區(qū)的末尾,
每次都是從緩沖區(qū)的頭部讀出數(shù)據(jù)。需要雙方通信時,需要建立起兩個管道;只能用于父子進程或者兄弟進程之間(具有親緣關系的進程);xlanchen@2006.6.213EmbeddedOperatingSystems在shell中使用管道的例子命令:“l(fā)s|more”
使用pipeline“|”將兩個命令”ls”和“more”連接起來,使得ls的輸出成為more的輸入也可以使用如下的兩個命令命令1:“l(fā)s>tmp”命令2:”more<tmp”
命令1把ls的輸出重定向到tmp文件中;
命令2把more的輸入重定向到tmp文件xlanchen@2006.6.214EmbeddedOperatingSystems創(chuàng)建一個管道
管道可看成是被打開的文件,但并沒有真實的
文件與之對應pipe()系統(tǒng)調(diào)用用來創(chuàng)建一個新的管道
#include<unistd.h>
int
pipe(intfiledes[2]);管道兩端分別用描述符filedes[0]和filedes[1]描述管道兩端的功能是固定的:filedes[0]只能用于讀,稱為管道讀端;filedes[1]只能用于寫,稱為管道寫端。若試圖從寫端讀,或者向讀端寫都將導致錯誤發(fā)生。一般文件的I/O函數(shù)都可用于管道,如close、read、write等。xlanchen@2006.6.215EmbeddedOperatingSystems使用管道的典型程序testpipe.c管道只能在具有親緣關系的進程之間進行通信通過fork傳遞管道的描述符任意的兩個進程不可能共享同一個管道無法打開已經(jīng)存在的管道xlanchen@2006.6.216EmbeddedOperatingSystemsFIFO
管道的一個重大限制是它沒有名字,因此
只能用于具有親緣關系的進程間通信,在
有名管道(namedpipe或FIFO)提出后,
該限制得到了克服。FIFO,有名管道特殊的文件類型:
1,嚴格遵循先入先出的讀寫規(guī)則
2,類似管道,在文件系統(tǒng)中不存在數(shù)據(jù)塊,而是與一塊內(nèi)核緩沖區(qū)相關聯(lián)
3,有名字,F(xiàn)IFO的名字包含在系統(tǒng)的目錄樹結構中,可以按名訪問xlanchen@2006.6.217EmbeddedOperatingSystemsFIFO的操作:以及:open,close,read,write等普通文件操作xlanchen@2006.6.218EmbeddedOperatingSystemsFIFO舉例創(chuàng)建一個FIFO:createfifo.c向FIFO寫:writefifo.c從FIFO讀:readfifo.cxlanchen@2006.6.219EmbeddedOperatingSystemscreatefifo.cxlanchen@2006.6.2110EmbeddedOperatingSystemswritefifo.cxlanchen@2006.6.2111EmbeddedOperatingSystemsreadfifo.c
xlanchen@2006.6.2112EmbeddedOperatingSystems2、消息隊列消息隊列就是一個消息的鏈表。可以把消息看作一個記錄,具有特定的格式以及特定的優(yōu)先級。對消息隊列有寫權限的進程可以按照一定的規(guī)則向消息隊列添加新消息;
對消息隊列有讀權限的進程則可以從消息隊列中讀走消息。xlanchen@2006.6.2113EmbeddedOperatingSystems消息隊列的創(chuàng)建int
msgget(key_tkey,int
msgflg)
根據(jù)給定的鍵值,返回對應的消息隊列若能找到,則返回已有的;否則,創(chuàng)建一個新的xlanchen@2006.6.2114EmbeddedOperatingSystems發(fā)送消息int
msgsnd(int
msqid, //目標消息隊列
struct
msgbuf*msgp, //待發(fā)送的消息
int
msgsz, //消息的大小
int
msgflg); //標志對于發(fā)送消息來講,msgflg有意義的標志為
IPC_NOWAIT:指明在消息隊列沒有足夠空間容納要發(fā)送的消息時,msgsnd是否等待xlanchen@2006.6.2115EmbeddedOperatingSystems接收消息int
msgrcv(int
msqid,//msqid為消息隊列描述字
struct
msgbuf*msgp,//消息返回后存儲這里
int
msgsz, //指定消息內(nèi)容的長度
longmsgtyp, //請求讀取的消息類型
nt
msgflg);
讀消息標志msgflg可以為以下幾個常量的或:IPC_NOWAIT:如果沒有滿足條件的消息,立即返回,此時,errno=ENOMSGIPC_EXCEPT:與msgtyp>0配合使用,返回隊列中第一個類型不為msgtyp的消息IPC_NOERROR:如果隊列中滿足條件的消息內(nèi)容大于所請求的msgsz字節(jié),則把該消息截斷,截斷部分將丟失。xlanchen@2006.6.2116EmbeddedOperatingSystems消息隊列的其他操作int
msgctl(int
msqid,int
cmd,struct
msqid_ds*buf);
對由msqid標識的消息隊列執(zhí)行cmd操作:IPC_STAT:獲取消息隊列信息,返回的信息存貯在buf中;IPC_SET:設置消息隊列的屬性,要設置的屬性存儲在buf中;可設置屬性包括:msg_perm.uid、msg_perm.gid、msg_perm.mode以及msg_qbytes,同時,也影響msg_ctime成員。IPC_RMID:刪除消息隊列xlanchen@2006.6.2117EmbeddedOperatingSystems3、信號量Semphore,用來對資源進行并發(fā)控制訪問通常是一個計數(shù)器如果資源可用,值>0如果不可用,值<=0當進程需要訪問資源,但資源不可用時,將計數(shù)值-1,并阻塞當進程釋放資源,使得資源有資源可用時,就喚醒被阻塞的進程xlanchen@2006.6.2118EmbeddedOperatingSystems獲得信號量集描述符semop用來獲取或釋放信號量對應的資源xlanchen@2006.6.2119EmbeddedOperatingSystems對semop中sembuf結構的解釋sembuf中包含下列幾個分量:unsignedshortsem_num;//要操作的信號量的序號shortsem_op;//要進行的操作shortsem_flg;//與操作相關的一些標記其中,sem_flg可以是IPC_NOWAIT:當期望的操作無法完成時,直接返回和SEM_UNDO:自動釋放標記sem_op的值確定要進行的操作>0:釋放資源=0:wait-for-zero<0:申請資源xlanchen@2006.6.2120EmbeddedOperatingSystemsSemctl對信號量進行控制,可以用來刪除一個信號量第4個參數(shù)可選,是一個union,其含義根據(jù)cmd進行解釋unionsemun{
int
val;
struct
semid_ds*buf;unsignedshort*array;
struct
seminfo*__buf;}xlanchen@2006.6.2121EmbeddedOperatingSystems對semctl中cmd等的解釋
cmd可以是:IPC_STAT,將信號量集的信息復制到第四個參
數(shù)所提示的空間中,此時第四個參數(shù)為:struct
semid_ds*buf。此時第二個參數(shù)無用IPC_SET,與上一個操作相反IPC_RMID,刪除信號量集,不使用第四個參數(shù)GETALL/SETALL,使用第四個參數(shù):unsignedshort*array,獲取/設置所有信號量的值GETVAL/SETVAL,前者使用第4個參數(shù):int
val,獲得/設置指定信號量的值GETNCNT、GETPID、GETZCNTxlanchen@2006.6.2122EmbeddedOperatingSystemsCmd使用舉例unionsemun
args;args.val=1;semctl(sem_id,sem_no,SETVAL,args);inti=semctl(sem_id,sem_no,GETVAL);semctl(sem_id,sem_no,IPC_RMID);xlanchen@2006.6.2123EmbeddedOperatingSystems使用信號量互斥usesem.c注意:示例程序僅僅是為了說明進程之間的互斥xlanchen@2006.6.2124EmbeddedOperatingSystems4、共享內(nèi)存允許兩個或多個進程通過把公共數(shù)據(jù)放入一個共享內(nèi)存區(qū)來訪問它們獲得或創(chuàng)建一個共享內(nèi)存區(qū)的IPC標志符將一個共享內(nèi)存區(qū)“附加”到一個進程上,使得進程可以訪問共享內(nèi)存區(qū)的內(nèi)容進程通過shmaddr指定并獲得共享內(nèi)存區(qū)在該進程中的起始地址將指定位置的共享內(nèi)存區(qū)從進程中分離出去xlanchen@2006.6.2125EmbeddedOperatingSystems兩個進程通過共享內(nèi)存進行通信testshm.ctestshm2.cxlanchen@2006.6.2126EmbeddedOperatingSystems5、套接字socket套接字不僅可以用來實現(xiàn)網(wǎng)絡間的進程通信,也可以用來實現(xiàn)本地的進程間通信相關調(diào)用包括:SocketListenBindConnect/acceptSend/recv,read/writeClose…xlanchen@2006.6.2127EmbeddedOperatingSystemsSocket建立一個套接字對于基于TCP/IP的編程,通常為:sockfd=socket(AF_INET,SOCK_STREAM,0)xlanchen@2006.6.2128EmbeddedOperatingSystems地址綁定將一個套接字與一個地址綁定網(wǎng)絡地址:struct
sockaddr{unsignedshortsa_family;charsa_data[14];};addressfamily例如:AF_INET14個字節(jié),協(xié)議地址
xlanchen@2006.6.2129EmbeddedOperatingSystemsInternet的地址struct
sockaddr_in{/*forconvenience*/shortintsin_family;unsignedshortintsin_port;/*2bytes*/
struct
in_addr
sin_addr;/*4bytes*/unsignedcharsin_zero[8];};sin_port和sin_addr要使用網(wǎng)絡字節(jié)序,跟主機上的不一定一致,需要轉換:
htons=hosttonetshort
htonl=hosttonetlongxlanchen@2006.6.2130EmbeddedOperatingSystemsServer端需要進行地址綁定int
sd;struct
sockaddr_in
my_addr;sd=socket(AF_INET,SOCK_STREAM,0);bzero(&(my_addr),sizeof(struct
sockaddr_in);my_addr.sin_family=AF_INET;my_addr.sin_port=htons(MYPORT);my_addr.sin_addr.s_addr=INADDR_ANY;bind(sd,(struct
sockaddr*)&my_addr,sizeof(struct
sockaddr));
bind填寫了服務器的地址和端口信息,最大的端口值為65535
xlanchen@2006.6.2131EmbeddedOperatingSystems服務器調(diào)用listen設置偵聽第二個參數(shù)指定最多客戶數(shù)listen(sd,5);listen將立即返回xlanchen@2006.6.2132EmbeddedOperatingSystems服務器調(diào)用accept接收客戶連接請求
sin_size=sizeof(struct
sockaddr_in);
newsd=accept(sd,&their_addr,&sin_size);Accept將會blocking直到有客戶連接返回與客戶端相關的newsd,并將客戶端的信息存放在their_addr中xlanchen@2006.6.2133EmbeddedOperatingSystemsTCP服務器編程模型
socket(...);
bind(...);
listen(...);
while(1)//循環(huán)服務器
{
accept(...);
while(1)
{
read(...);
process(...);
write(..
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年邏輯推理考題分析與總結
- 2025年現(xiàn)代漢語綜合應用試題及答案
- 現(xiàn)代漢語考試技巧分享試題及答案
- 2025年電商二手市場信用評估與體系建設研究報告
- 現(xiàn)代小說中的敘述創(chuàng)新文學概論試題及答案
- 系統(tǒng)集成的整體方法與實踐試題及答案
- 2025年邏輯考試新思潮解析試題及答案
- 法學概論對社會問題的法律回應試題及答案
- 2025年綠色建筑材料市場推廣與政策支持下的綠色建筑市場風險防控與拓展策略研究報告
- 某年度消霧塔戰(zhàn)略市場規(guī)劃報告
- GB/T 2951.12-2008電纜和光纜絕緣和護套材料通用試驗方法第12部分:通用試驗方法-熱老化試驗方法
- GB/T 24610.2-2009滾動軸承振動測量方法第2部分:具有圓柱孔和圓柱外表面的向心球軸承
- GB 5009.92-2016食品安全國家標準食品中鈣的測定
- GA 838-2009小型民用爆炸物品儲存庫安全規(guī)范
- 新疆理工學院面向社會公開招聘27名行政教輔人員【共500題含答案解析】模擬檢測試卷
- 大會-冠脈微循環(huán)障礙課件
- 《城市環(huán)境衛(wèi)生質(zhì)量標準》
- 2023年湖北省武漢第二中學高考英語一模試卷(含答案解析)
- 2023屆高考語文復習:西藏男孩丁真 課件
- DB4401-T 31-2019數(shù)字地圖測繪技術規(guī)程-(高清現(xiàn)行)
- 吡格列酮聯(lián)合二甲雙胍治療2型糖尿病的循證證據(jù)
評論
0/150
提交評論