進(jìn)程間同步和通信_(tái)第1頁(yè)
進(jìn)程間同步和通信_(tái)第2頁(yè)
進(jìn)程間同步和通信_(tái)第3頁(yè)
進(jìn)程間同步和通信_(tái)第4頁(yè)
進(jìn)程間同步和通信_(tái)第5頁(yè)
已閱讀5頁(yè),還剩32頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

進(jìn)程間同步和通信xlanchen@2007.6.25xlanchen@2006.6.211EmbeddedOperatingSystems進(jìn)程間通信IPC,Inter-ProcessCommunicationUnix系統(tǒng)提供的基本的IPC包括:1、管道和FIFO(有名管道)2、消息3、信號(hào)量4、共享內(nèi)存區(qū)5、套接字xlanchen@2006.6.212EmbeddedOperatingSystems1、管道(pipe)管道是所有Unix都提供的一種IPC機(jī)制管道是半雙工的,數(shù)據(jù)只能向一個(gè)方向流動(dòng);一個(gè)進(jìn)程將數(shù)據(jù)寫(xiě)入管道,

另一個(gè)進(jìn)程從管道中讀取數(shù)據(jù)數(shù)據(jù)的讀出和寫(xiě)入:

寫(xiě)入的內(nèi)容每次都添加在管道緩沖區(qū)的末尾,

每次都是從緩沖區(qū)的頭部讀出數(shù)據(jù)。需要雙方通信時(shí),需要建立起兩個(gè)管道;只能用于父子進(jìn)程或者兄弟進(jìn)程之間(具有親緣關(guān)系的進(jìn)程);xlanchen@2006.6.213EmbeddedOperatingSystems在shell中使用管道的例子命令:“l(fā)s|more”

使用pipeline“|”將兩個(gè)命令”ls”和“more”連接起來(lái),使得ls的輸出成為more的輸入也可以使用如下的兩個(gè)命令命令1:“l(fā)s>tmp”命令2:”more<tmp”

命令1把ls的輸出重定向到tmp文件中;

命令2把more的輸入重定向到tmp文件xlanchen@2006.6.214EmbeddedOperatingSystems創(chuàng)建一個(gè)管道

管道可看成是被打開(kāi)的文件,但并沒(méi)有真實(shí)的

文件與之對(duì)應(yīng)pipe()系統(tǒng)調(diào)用用來(lái)創(chuàng)建一個(gè)新的管道

#include<unistd.h>

int

pipe(intfiledes[2]);管道兩端分別用描述符filedes[0]和filedes[1]描述管道兩端的功能是固定的:filedes[0]只能用于讀,稱(chēng)為管道讀端;filedes[1]只能用于寫(xiě),稱(chēng)為管道寫(xiě)端。若試圖從寫(xiě)端讀,或者向讀端寫(xiě)都將導(dǎo)致錯(cuò)誤發(fā)生。一般文件的I/O函數(shù)都可用于管道,如close、read、write等。xlanchen@2006.6.215EmbeddedOperatingSystems使用管道的典型程序testpipe.c管道只能在具有親緣關(guān)系的進(jìn)程之間進(jìn)行通信通過(guò)fork傳遞管道的描述符任意的兩個(gè)進(jìn)程不可能共享同一個(gè)管道無(wú)法打開(kāi)已經(jīng)存在的管道xlanchen@2006.6.216EmbeddedOperatingSystemsFIFO

管道的一個(gè)重大限制是它沒(méi)有名字,因此

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

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

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

1,嚴(yán)格遵循先入先出的讀寫(xiě)規(guī)則

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

3,有名字,F(xiàn)IFO的名字包含在系統(tǒng)的目錄樹(shù)結(jié)構(gòu)中,可以按名訪問(wèn)xlanchen@2006.6.217EmbeddedOperatingSystemsFIFO的操作:以及:open,close,read,write等普通文件操作xlanchen@2006.6.218EmbeddedOperatingSystemsFIFO舉例創(chuàng)建一個(gè)FIFO:createfifo.c向FIFO寫(xiě):writefifo.c從FIFO讀:readfifo.cxlanchen@2006.6.219EmbeddedOperatingSystemscreatefifo.cxlanchen@2006.6.2110EmbeddedOperatingSystemswritefifo.cxlanchen@2006.6.2111EmbeddedOperatingSystemsreadfifo.c

xlanchen@2006.6.2112EmbeddedOperatingSystems2、消息隊(duì)列消息隊(duì)列就是一個(gè)消息的鏈表。可以把消息看作一個(gè)記錄,具有特定的格式以及特定的優(yōu)先級(jí)。對(duì)消息隊(duì)列有寫(xiě)權(quán)限的進(jìn)程可以按照一定的規(guī)則向消息隊(duì)列添加新消息;

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

msgget(key_tkey,int

msgflg)

根據(jù)給定的鍵值,返回對(duì)應(yīng)的消息隊(duì)列若能找到,則返回已有的;否則,創(chuàng)建一個(gè)新的xlanchen@2006.6.2114EmbeddedOperatingSystems發(fā)送消息int

msgsnd(int

msqid, //目標(biāo)消息隊(duì)列

struct

msgbuf*msgp, //待發(fā)送的消息

int

msgsz, //消息的大小

int

msgflg); //標(biāo)志對(duì)于發(fā)送消息來(lái)講,msgflg有意義的標(biāo)志為

IPC_NOWAIT:指明在消息隊(duì)列沒(méi)有足夠空間容納要發(fā)送的消息時(shí),msgsnd是否等待xlanchen@2006.6.2115EmbeddedOperatingSystems接收消息int

msgrcv(int

msqid,//msqid為消息隊(duì)列描述字

struct

msgbuf*msgp,//消息返回后存儲(chǔ)這里

int

msgsz, //指定消息內(nèi)容的長(zhǎng)度

longmsgtyp, //請(qǐng)求讀取的消息類(lèi)型

nt

msgflg);

讀消息標(biāo)志msgflg可以為以下幾個(gè)常量的或:IPC_NOWAIT:如果沒(méi)有滿(mǎn)足條件的消息,立即返回,此時(shí),errno=ENOMSGIPC_EXCEPT:與msgtyp>0配合使用,返回隊(duì)列中第一個(gè)類(lèi)型不為msgtyp的消息IPC_NOERROR:如果隊(duì)列中滿(mǎn)足條件的消息內(nèi)容大于所請(qǐng)求的msgsz字節(jié),則把該消息截?cái)啵財(cái)嗖糠謱G失。xlanchen@2006.6.2116EmbeddedOperatingSystems消息隊(duì)列的其他操作int

msgctl(int

msqid,int

cmd,struct

msqid_ds*buf);

對(duì)由msqid標(biāo)識(shí)的消息隊(duì)列執(zhí)行cmd操作:IPC_STAT:獲取消息隊(duì)列信息,返回的信息存貯在buf中;IPC_SET:設(shè)置消息隊(duì)列的屬性,要設(shè)置的屬性存儲(chǔ)在buf中;可設(shè)置屬性包括:msg_perm.uid、msg_perm.gid、msg_perm.mode以及msg_qbytes,同時(shí),也影響msg_ctime成員。IPC_RMID:刪除消息隊(duì)列xlanchen@2006.6.2117EmbeddedOperatingSystems3、信號(hào)量Semphore,用來(lái)對(duì)資源進(jìn)行并發(fā)控制訪問(wèn)通常是一個(gè)計(jì)數(shù)器如果資源可用,值>0如果不可用,值<=0當(dāng)進(jìn)程需要訪問(wèn)資源,但資源不可用時(shí),將計(jì)數(shù)值-1,并阻塞當(dāng)進(jìn)程釋放資源,使得資源有資源可用時(shí),就喚醒被阻塞的進(jìn)程xlanchen@2006.6.2118EmbeddedOperatingSystems獲得信號(hào)量集描述符semop用來(lái)獲取或釋放信號(hào)量對(duì)應(yīng)的資源xlanchen@2006.6.2119EmbeddedOperatingSystems對(duì)semop中sembuf結(jié)構(gòu)的解釋sembuf中包含下列幾個(gè)分量:unsignedshortsem_num;//要操作的信號(hào)量的序號(hào)shortsem_op;//要進(jìn)行的操作shortsem_flg;//與操作相關(guān)的一些標(biāo)記其中,sem_flg可以是IPC_NOWAIT:當(dāng)期望的操作無(wú)法完成時(shí),直接返回和SEM_UNDO:自動(dòng)釋放標(biāo)記sem_op的值確定要進(jìn)行的操作>0:釋放資源=0:wait-for-zero<0:申請(qǐng)資源xlanchen@2006.6.2120EmbeddedOperatingSystemsSemctl對(duì)信號(hào)量進(jìn)行控制,可以用來(lái)刪除一個(gè)信號(hào)量第4個(gè)參數(shù)可選,是一個(gè)union,其含義根據(jù)cmd進(jìn)行解釋unionsemun{

int

val;

struct

semid_ds*buf;unsignedshort*array;

struct

seminfo*__buf;}xlanchen@2006.6.2121EmbeddedOperatingSystems對(duì)semctl中cmd等的解釋

cmd可以是:IPC_STAT,將信號(hào)量集的信息復(fù)制到第四個(gè)參

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

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

val,獲得/設(shè)置指定信號(hào)量的值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使用信號(hào)量互斥usesem.c注意:示例程序僅僅是為了說(shuō)明進(jìn)程之間的互斥xlanchen@2006.6.2124EmbeddedOperatingSystems4、共享內(nèi)存允許兩個(gè)或多個(gè)進(jìn)程通過(guò)把公共數(shù)據(jù)放入一個(gè)共享內(nèi)存區(qū)來(lái)訪問(wèn)它們獲得或創(chuàng)建一個(gè)共享內(nèi)存區(qū)的IPC標(biāo)志符將一個(gè)共享內(nèi)存區(qū)“附加”到一個(gè)進(jìn)程上,使得進(jìn)程可以訪問(wèn)共享內(nèi)存區(qū)的內(nèi)容進(jìn)程通過(guò)shmaddr指定并獲得共享內(nèi)存區(qū)在該進(jìn)程中的起始地址將指定位置的共享內(nèi)存區(qū)從進(jìn)程中分離出去xlanchen@2006.6.2125EmbeddedOperatingSystems兩個(gè)進(jìn)程通過(guò)共享內(nèi)存進(jìn)行通信testshm.ctestshm2.cxlanchen@2006.6.2126EmbeddedOperatingSystems5、套接字socket套接字不僅可以用來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)間的進(jìn)程通信,也可以用來(lái)實(shí)現(xiàn)本地的進(jìn)程間通信相關(guān)調(diào)用包括:SocketListenBindConnect/acceptSend/recv,read/writeClose…xlanchen@2006.6.2127EmbeddedOperatingSystemsSocket建立一個(gè)套接字對(duì)于基于TCP/IP的編程,通常為:sockfd=socket(AF_INET,SOCK_STREAM,0)xlanchen@2006.6.2128EmbeddedOperatingSystems地址綁定將一個(gè)套接字與一個(gè)地址綁定網(wǎng)絡(luò)地址:struct

sockaddr{unsignedshortsa_family;charsa_data[14];};addressfamily例如:AF_INET14個(gè)字節(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é)序,跟主機(jī)上的不一定一致,需要轉(zhuǎn)換:

htons=hosttonetshort

htonl=hosttonetlongxlanchen@2006.6.2130EmbeddedOperatingSystemsServer端需要進(jìn)行地址綁定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填寫(xiě)了服務(wù)器的地址和端口信息,最大的端口值為65535

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

sin_size=sizeof(struct

sockaddr_in);

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

socket(...);

bind(...);

listen(...);

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

{

accept(...);

while(1)

{

read(...);

process(...);

write(..

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論