進程間同步和通信_第1頁
進程間同步和通信_第2頁
進程間同步和通信_第3頁
進程間同步和通信_第4頁
進程間同步和通信_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

進程間同步和通信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ù)。需要雙方通信時,需要建立起兩個管道;只能用于父子進程或者兄弟進程之間(具有親緣關(guān)系的進程);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)建一個管道

管道可看成是被打開的文件,但并沒有真實的

文件與之對應(yī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管道只能在具有親緣關(guān)系的進程之間進行通信通過fork傳遞管道的描述符任意的兩個進程不可能共享同一個管道無法打開已經(jīng)存在的管道xlanchen@2006.6.216EmbeddedOperatingSystemsFIFO

管道的一個重大限制是它沒有名字,因此

只能用于具有親緣關(guān)系的進程間通信,在

有名管道(namedpipe或FIFO)提出后,

該限制得到了克服。FIFO,有名管道特殊的文件類型:

1,嚴格遵循先入先出的讀寫規(guī)則

2,類似管道,在文件系統(tǒng)中不存在數(shù)據(jù)塊,而是與一塊內(nèi)核緩沖區(qū)相關(guān)聯(lián)

3,有名字,F(xiàn)IFO的名字包含在系統(tǒng)的目錄樹結(jié)構(gòu)中,可以按名訪問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)先級。對消息隊列有寫權(quán)限的進程可以按照一定的規(guī)則向消息隊列添加新消息;

對消息隊列有讀權(quán)限的進程則可以從消息隊列中讀走消息。xlanchen@2006.6.2113EmbeddedOperatingSystems消息隊列的創(chuàng)建int

msgget(key_tkey,int

msgflg)

根據(jù)給定的鍵值,返回對應(yīng)的消息隊列若能找到,則返回已有的;否則,創(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:設(shè)置消息隊列的屬性,要設(shè)置的屬性存儲在buf中;可設(shè)置屬性包括: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用來獲取或釋放信號量對應(yīng)的資源xlanchen@2006.6.2119EmbeddedOperatingSystems對semop中sembuf結(jié)構(gòu)的解釋sembuf中包含下列幾個分量:unsignedshortsem_num;//要操作的信號量的序號shortsem_op;//要進行的操作shortsem_flg;//與操作相關(guān)的一些標記其中,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,將信號量集的信息復(fù)制到第四個參

數(shù)所提示的空間中,此時第四個參數(shù)為:struct

semid_ds*buf。此時第二個參數(shù)無用IPC_SET,與上一個操作相反IPC_RMID,刪除信號量集,不使用第四個參數(shù)GETALL/SETALL,使用第四個參數(shù):unsignedshort*array,獲取/設(shè)置所有信號量的值GETVAL/SETVAL,前者使用第4個參數(shù):int

val,獲得/設(shè)置指定信號量的值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)絡(luò)間的進程通信,也可以用來實現(xiàn)本地的進程間通信相關(guā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)絡(luò)地址: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)絡(luò)字節(jié)序,跟主機上的不一定一致,需要轉(zhuǎn)換:

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填寫了服務(wù)器的地址和端口信息,最大的端口值為65535

xlanchen@2006.6.2131EmbeddedOperatingSystems服務(wù)器調(diào)用listen設(shè)置偵聽第二個參數(shù)指定最多客戶數(shù)listen(sd,5);listen將立即返回xlanchen@2006.6.2132EmbeddedOperatingSystems服務(wù)器調(diào)用accept接收客戶連接請求

sin_size=sizeof(struct

sockaddr_in);

newsd=accept(sd,&their_addr,&sin_size);Accept將會blocking直到有客戶連接返回與客戶端相關(guān)的newsd,并將客戶端的信息存放在their_addr中xlanchen@2006.6.2133EmbeddedOperatingSystemsTCP服務(wù)器編程模型

socket(...);

bind(...);

listen(...);

while(1)//循環(huán)服務(wù)器

{

accept(...);

while(1)

{

read(...);

process(...);

write(..

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論