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

下載本文檔

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

文檔簡(jiǎn)介

1、第5章System V進(jìn)程間通信 System VIPC基礎(chǔ)基礎(chǔ) 消息隊(duì)列消息隊(duì)列 信號(hào)量通信機(jī)制信號(hào)量通信機(jī)制 共享內(nèi)存共享內(nèi)存 為了提供與其他系統(tǒng)的兼容性,Linux也支持三種System V的進(jìn)程間通信機(jī)制:消息隊(duì)列、信號(hào)量和共享內(nèi)存消息隊(duì)列、信號(hào)量和共享內(nèi)存,Linux對(duì)這些機(jī)制的實(shí)施大同小異。我們把信號(hào)量、消息隊(duì)列和共享內(nèi)存統(tǒng)稱System V IPC對(duì)象。就像每個(gè)文件都有一個(gè)打開文件號(hào)一樣,每個(gè)對(duì)象也都有唯一的識(shí)別號(hào),進(jìn)程可以通過系統(tǒng)調(diào)用傳遞的識(shí)別號(hào)來存取這些對(duì)象。與文件的存取一樣,對(duì)這些對(duì)象的存取也要驗(yàn)證存取權(quán)限,System V IPC可以通過系統(tǒng)調(diào)用對(duì)對(duì)象的創(chuàng)建者設(shè)置這些對(duì)象

2、的存取權(quán)限。2021-11-62 ipcs 命令I(lǐng)pcs命令用于顯示消息隊(duì)列、共享內(nèi)存、信號(hào)量的信息。q 顯示消息隊(duì)列 s 顯示信號(hào)量m 顯示共享內(nèi)存 a 詳細(xì)信息對(duì)每一個(gè)資源,這個(gè)命令會(huì)顯示:TYPE 包括信息隊(duì)列(q),共享內(nèi)存(m),或者信號(hào)量(s)。ID 資源條目的唯一的表示號(hào)KEY應(yīng)用程序存取資源使用的參數(shù)。MODE 存取模式和許可權(quán)限的標(biāo)記OWNER and GROUP 登錄名和用戶屬主的組號(hào)2021-11-63key值和ID值 Linux系統(tǒng)為每個(gè)IPC機(jī)制都分配了唯一的ID,所有針對(duì)該IPC機(jī)制的操作都使用對(duì)應(yīng)的ID。因此,通信的雙方都需要通過某個(gè)辦法來獲取ID值。顯然,創(chuàng)建者

3、根據(jù)創(chuàng)建函數(shù)的返回值可獲取該值,但另一個(gè)進(jìn)程如何實(shí)現(xiàn)呢?由于Linux兩個(gè)進(jìn)程不能隨意訪問對(duì)方的空間(一個(gè)特殊是,子進(jìn)程可以繼承父親進(jìn)程的數(shù)據(jù),實(shí)現(xiàn)父親進(jìn)程向子進(jìn)程的單向傳遞),也就不能夠直接獲取這一ID值。為解決這一問題,IPC在實(shí)現(xiàn)時(shí)約定使用key值做為參數(shù)創(chuàng)建,如果在創(chuàng)建時(shí)使用相同的key值將得到同一個(gè)IPC對(duì)象的ID(即一方創(chuàng)建,另一方獲取的是ID),這樣就保證了雙方可以獲取用于傳遞數(shù)據(jù)的IPC機(jī)制ID值。 2021-11-64 ftok extern key_t ftok(_const char * _pathname, int _proj_id);此函數(shù)有兩個(gè)參數(shù),pathname

4、為文件路徑名,可以是特殊文件(例如目錄文件),也可以是當(dāng)前目錄“.”,而通常也是設(shè)置此參數(shù)為當(dāng)前目錄,因?yàn)楫?dāng)前目錄一般都是存在的,且不會(huì)被立即刪除。第二個(gè)參數(shù)為一個(gè)int型變量。2021-11-65例:ftok的使用#include #include main()key_t key;key=ftok(.,1);printf(the key is %xn,key);2021-11-6人民郵電出版社出版楊宗德編著6 ftok ftok函數(shù)創(chuàng)建key值過程中使用了該文件屬性的st_dev和st_ino。具體構(gòu)成如下:key值的第31-24為ftok()第二個(gè)參數(shù)的低8位;key值的第23-16為該文

5、件的st_dev屬性的低8位;key值的第15-0為該文件的st_ino屬性的低16位;因此,如果使用相同的文件路徑及整數(shù),得到的key值是唯一的,而唯一的key值創(chuàng)建某類IPC機(jī)制時(shí)將得到同一個(gè)IPC機(jī)制(但如果使用相同的key值分別創(chuàng)建一個(gè)消息隊(duì)列和一個(gè)信號(hào)量,兩者沒有聯(lián)系),而文件路徑的訪問對(duì)兩個(gè)進(jìn)程來說很容易統(tǒng)一,因此,便捷的實(shí)現(xiàn)了兩進(jìn)程通信機(jī)制的確定。2021-11-67例:ftok函數(shù)和參數(shù)的關(guān)系#include #include #include #include main(int argc, char * argv)key_t key;int i;struct stat buf

6、;if(argc!=3)printf(error usagen);return 1;i=atoi(argv2);2021-11-68例:ftok函數(shù)和參數(shù)的關(guān)系if(stat(argv1,&buf)=-1) perror(stat);exit(EXIT_FAILURE);printf(file st_dev=%xn,buf.st_dev);printf(file st_ino=%xn,buf.st_ino);printf(number=%xn,i);key=ftok(argv1,i);printf(key=0 x%x ,key);2021-11-69第5章System V進(jìn)程間通信 S

7、ystem VIPC基礎(chǔ)基礎(chǔ) 消息隊(duì)列消息隊(duì)列 信號(hào)量通信機(jī)制信號(hào)量通信機(jī)制 共享內(nèi)存共享內(nèi)存 消息隊(duì)列的基本概念消息隊(duì)列就是一個(gè)消息的鏈表,是一系列保存在內(nèi)核中的消息的列表。用戶進(jìn)程可以向消息隊(duì)列添加消息,也可以從消息隊(duì)列讀取消息。消息隊(duì)列與管道通信相比,其優(yōu)勢(shì)是對(duì)每一個(gè)消息制定特定消息類型,接收的時(shí)候不需要按隊(duì)列次序,而是可以根據(jù)自定義條件接收特定類型的消息。可以把消息看作一個(gè)記錄,具有特定的格式以及特定的優(yōu)先級(jí)。對(duì)消息隊(duì)列有寫權(quán)限的進(jìn)程可以向消息隊(duì)列中按照一定的規(guī)則添加新消息;對(duì)消息隊(duì)列有讀權(quán)限的進(jìn)程則可以從消息隊(duì)列中讀取消息。2021-11-611消息隊(duì)列屬性2021-11-612消息

8、struct msg結(jié)構(gòu)體 /come from /usr/src/kernels/uname r/inlcude/linux/msg.h/*one msg_msg structure for each message */struct msg_msgstruct list_head m_list;long m_type;int m_ts; /*message test size */struct msg_msgseg* next;void * security;/* the actual message follows immediately */;2021-11-613消息隊(duì)列2021-1

9、1-614對(duì)消息隊(duì)列的說明對(duì)消息隊(duì)列的限定:/come from /usr/include/linux/msg.h#define MSGMNI 16 /*=IPCMNI */ /* max # of msg queue identifiers */#define MSGMAX 8192 /*=INT_MAX */ /* max size of message (bytes) */#define MSGMNB 16384 /*0 收到第一條msgtyp類型的消息。msgtyp0收到第一條最低類型(小于或等于msgtyp的絕對(duì)值)的消息。第五個(gè)參數(shù)msgflg指定所需類型消息不在隊(duì)列上時(shí)將要采取的

10、操作。2021-11-624消息隊(duì)列應(yīng)用實(shí)例 #include #include #include #include #include #include #include struct msgmbuflong msg_type;char msg_text512;2021-11-625消息隊(duì)列應(yīng)用實(shí)例 int main()int qid;key_t key;int len;struct msgmbuf msg;if(key=ftok(.,a)=-1)perror(ftok);exit(EXIT_FAILURE);if(qid=msgget(key,IPC_CREAT|0666)=-1)perro

11、r(msgget);exit(EXIT_FAILURE);2021-11-626消息隊(duì)列應(yīng)用實(shí)例 printf(ID of the queue is: %dn,qid);puts(please input the mssage:);if(fgets(&msg)-msg_text,512,stdin)=NULL) puts(no message!);exit(EXIT_FAILURE);msg.msg_type=getpid();len=strlen(msg.msg_text);if(msgsnd(qid,&msg,len,0)0)perror(msgsnd);exit(EXIT

12、_FAILURE);2021-11-627消息隊(duì)列應(yīng)用實(shí)例 if(msgrcv(qid,&msg,512,0,0)msg_text);if(msgctl(qid,IPC_RMID,NULL)0)perror(msgctl);exit(EXIT_FAILURE);exit(0);2021-11-628第5章System V進(jìn)程間通信 System VIPC基礎(chǔ)基礎(chǔ) 消息隊(duì)列消息隊(duì)列 信號(hào)量通信機(jī)制信號(hào)量通信機(jī)制 共享內(nèi)存共享內(nèi)存 信號(hào)量基本概念信號(hào)量是操作系統(tǒng)中解決進(jìn)程或線程同步與互斥的最重要機(jī)制之一。Linux內(nèi)核提供System V的信號(hào)量機(jī)制,用于實(shí)現(xiàn)進(jìn)程之間通信。信號(hào)量常用系統(tǒng)調(diào)

13、用見下表函數(shù)函數(shù)功能功能sem_init初始化一個(gè)信號(hào)量sem_wait阻塞線程sem_post增加信號(hào)量的值sem_destory釋放信號(hào)量2021-11-630信號(hào)量集合屬性2021-11-631信號(hào)量結(jié)構(gòu) /come from /usr/src/kernels/uname -r/include/linux/sem.h/* One semaphore structure for each semaphore in the system. */struct semint semval; /* current value */int sempid; /* pid of last operati

14、on */;2021-11-632信號(hào)量通信機(jī)制概念圖 2021-11-633創(chuàng)建信號(hào)量集合 extern int semget(key_t _key, int _nsems, int _semflg);第一個(gè)參數(shù)為key_t類型的key值,一般由ftok函數(shù)產(chǎn)生。第二個(gè)參數(shù)_nsems為創(chuàng)建的信號(hào)量個(gè)數(shù),各信號(hào)量以數(shù)組的方式存儲(chǔ)。這個(gè)數(shù)組用于初始化數(shù)組對(duì)象。第三個(gè)參數(shù)_semflg用來標(biāo)識(shí)信號(hào)量集合的權(quán)限。如0770,為文件的訪問權(quán)限類型。此外,還可以附加以下參數(shù)值。這些值可以與基本權(quán)限以或的方式一起使用。/come from /usr/include/bit/ipc.h/*resource

15、 get request flags */#define IPC_CREAT 00001000 /*create if key is non existent */#define IPC_EXCL 00002000 /*fail if key exists */#define IPC_NOWAIT 00004000 /*return error on wait */2021-11-634控制信號(hào)量集合、信號(hào)量extern int semctl(int _semid, int _semnum, int _cmd,)該函數(shù)最多可有四個(gè)參數(shù)(有可能只有三個(gè)參數(shù))。第一個(gè)參數(shù)_semid為要操作的信號(hào)

16、量集合標(biāo)識(shí)符,該值一般由semget函數(shù)返回。第二個(gè)參數(shù)為集合中信號(hào)量的編號(hào)。如果標(biāo)識(shí)某個(gè)信號(hào)量,此值為該信號(hào)量的下標(biāo)(從0到n-1);如果標(biāo)識(shí)整個(gè)信號(hào)量集合,則設(shè)置為0。第三個(gè)參數(shù)為要執(zhí)行的操作,如果是對(duì)整個(gè)信號(hào)量集合,這些操作在/usr/include/linux/ipc.h文件中定義。其操作包括IPC_RMID、IPC_SET、IPC_STAT和IPC_INFO,具體含義同msgctl的相關(guān)操作。2021-11-6352021-11-636信號(hào)量操作 extern int semop(int _semid, struct sembuf * _sops, size_t _nsops);此函

17、數(shù)第一個(gè)參數(shù)為要操作的信號(hào)量集合標(biāo)識(shí)符,該值一般由semget函數(shù)返回。第二個(gè)參數(shù)為struct sembuf結(jié)構(gòu)的變量,其定義如下:/come from /usr/include/linux/sem.h/* semop system calls takes an array of these. */struct sembuf unsigned short sem_num; /* semaphore index in array */short sem_op; /*semaphore operation */short sem_flg; /* operation flags */2021-11

18、-637信號(hào)量操作(2) 此結(jié)構(gòu)體有三個(gè)成員變量。1) sem_num為操作的信號(hào)量編號(hào)。2)sem_op為作用于信號(hào)量的操作:該值如果為正整數(shù)表示增加信號(hào)量的值,如果為負(fù)整數(shù)表示減小信號(hào)量的值,如果為0表示對(duì)信號(hào)量的當(dāng)前值進(jìn)行是否為0的測(cè)試。3)sem_flg為操作標(biāo)識(shí)。2021-11-638使用信號(hào)量實(shí)現(xiàn)生產(chǎn)消費(fèi)問題 生產(chǎn)消費(fèi)問題是一個(gè)經(jīng)典的數(shù)學(xué)問題,要求生產(chǎn)者消費(fèi)者在固定的倉(cāng)庫(kù)空間條件下,生產(chǎn)者每生產(chǎn)一個(gè)產(chǎn)品將占用一個(gè)倉(cāng)庫(kù)空間,生產(chǎn)者生產(chǎn)的產(chǎn)品庫(kù)存不能越過倉(cāng)庫(kù)的存儲(chǔ)量,消費(fèi)者每消費(fèi)一個(gè)產(chǎn)品將增加一個(gè)倉(cāng)庫(kù)空間,消費(fèi)者在倉(cāng)庫(kù)產(chǎn)品為0時(shí)不能再消費(fèi)。本例中采用信號(hào)量來解決這個(gè)問題,為了便于理解,

19、本例中使用了兩個(gè)信號(hào)量,一個(gè)用來管理消費(fèi)者(以下為sem_produce),一個(gè)用來管理生產(chǎn)者(以下為sem_custom),即sem_produce表示當(dāng)前倉(cāng)庫(kù)可用空間的數(shù)量,sem_custom用來表示當(dāng)前倉(cāng)庫(kù)中產(chǎn)品的數(shù)量。對(duì)于生產(chǎn)者來說,其需要申請(qǐng)的資源為倉(cāng)庫(kù)中的剩余空間,因此,生產(chǎn)者在生產(chǎn)一個(gè)產(chǎn)品前,申請(qǐng)sem_produce信號(hào)量,當(dāng)此信號(hào)量的值大于0,即有可用空間,將生產(chǎn)產(chǎn)品,并將sem_produce的值減去1(因?yàn)檎加昧艘粋€(gè)空間);同時(shí),當(dāng)其生產(chǎn)一個(gè)產(chǎn)品后,當(dāng)前倉(cāng)庫(kù)的產(chǎn)品數(shù)量增加1,需要將sem_custom信號(hào)量自動(dòng)加1。對(duì)于消費(fèi)者來說,其需要申請(qǐng)的資源為倉(cāng)庫(kù)中的產(chǎn)品,因此,

20、消費(fèi)者在消費(fèi)一個(gè)產(chǎn)品前,將申請(qǐng)sem_custom信號(hào)量,當(dāng)此信號(hào)量的值大于0時(shí),即有可用產(chǎn)品,將消費(fèi)一個(gè)產(chǎn)品,并將sem_custom信號(hào)量的值減去(因?yàn)橄M(fèi)了一個(gè)產(chǎn)品),同時(shí),當(dāng)消費(fèi)一個(gè)產(chǎn)品,當(dāng)前倉(cāng)庫(kù)的剩余空間增加1,需要將sem_produce信號(hào)量自動(dòng)加1。2021-11-639第5章System V進(jìn)程間通信 System VIPC基礎(chǔ)基礎(chǔ) 消息隊(duì)列消息隊(duì)列 信號(hào)量通信機(jī)制信號(hào)量通信機(jī)制 共享內(nèi)存共享內(nèi)存 共享內(nèi)存的基本概念共享內(nèi)存允許兩個(gè)或多個(gè)進(jìn)程共享一個(gè)給定的存儲(chǔ)區(qū),這一段存儲(chǔ)區(qū)可以被兩個(gè)或兩個(gè)以上的進(jìn)程映射至自身的地址空間中。一個(gè)進(jìn)程寫入共享內(nèi)存中的信息,可以被其他使用這個(gè)共享

21、內(nèi)存的進(jìn)程,通過一個(gè)簡(jiǎn)單的內(nèi)存讀操作讀出,從而實(shí)現(xiàn)了進(jìn)程間的通信。2021-11-641共享內(nèi)存屬性2021-11-642共享內(nèi)存IPC原理 2021-11-643共享內(nèi)存與管道對(duì)比 2021-11-644共享內(nèi)存的常用函數(shù)函數(shù)函數(shù)功能功能mmap建立共享內(nèi)存映射munmap解除共享內(nèi)存映射shmget獲取共享內(nèi)存區(qū)域的IDshmctl共享內(nèi)存控制shmat映射共享內(nèi)存對(duì)象shmdt分離共享內(nèi)存對(duì)象2021-11-645內(nèi)存映射2021-11-646例:內(nèi)存映射的使用#include #include #include #include #include typedef structchar

22、name4;int age;people;main(int argc, char * argv)pid_t result; int i;people *p_map;char temp;2021-11-647例:內(nèi)存映射的使用p_map=(people *)mmap(NULL,sizeof(people)*10,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS, -1,0);result=fork();if(result0)perror(fork);exit(EXIT_FAILURE);else if(result=0)sleep(2);for(i=0;

23、i5;i+)printf(read by child:No.%ds age is:%dn,i+1,(*(p_map+i).age);2021-11-648例:內(nèi)存映射的使用(*p_map).age=110;munmap(p_map,sizeof(people)*10);exit(0);elsetemp=a;for(i=0;iname, &temp,2);(p_map+i)-age=20+i);2021-11-649例:內(nèi)存映射的使用sleep(5);printf(read by parent:the sum of age is:%dn,(*p_map).age);printf(unma

24、pingn);munmap(p_map,sizeof(people)*10);printf(unmap successful!n);2021-11-650創(chuàng)建共享內(nèi)存 extern int shmget(key_t _key, size_t _size, int _shmflg);第一個(gè)參數(shù)為key_t類型的key值,一般由ftok函數(shù)產(chǎn)生。第二個(gè)參數(shù)size為欲創(chuàng)建的共享內(nèi)存段大小(單位為字節(jié))。第三個(gè)參數(shù)shmflg用來標(biāo)識(shí)共享內(nèi)存段的創(chuàng)建標(biāo)識(shí)。包括/come from /usr/include/linu/ipc.h#define IPC_CREAT 01000 /*Create key if key does not exist. */#define IPC_EXCL 0

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論