版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、西南交通大學(xué)操作系統(tǒng)試驗(yàn)四西南交通大學(xué)進(jìn)程間的通信:共享內(nèi)存上課地點(diǎn):7105上課學(xué)期:大二下學(xué)期班級(jí):軟件4班學(xué)生學(xué)號(hào):2014112208姓名:侯正罡任課教師:胡曉鵬實(shí)驗(yàn)日期:2016.5.10實(shí)驗(yàn)名稱:進(jìn)程間的通信:共享內(nèi)存實(shí)驗(yàn)?zāi)康模?學(xué)習(xí)Linux多進(jìn)程通信的一種方式:共享內(nèi)存 2.學(xué)習(xí)若干可以產(chǎn)生信號(hào),接受信號(hào)的函數(shù)。實(shí)驗(yàn)內(nèi)容:一、什么是共享內(nèi)存(內(nèi)容來自博客)共享內(nèi)存就是允許兩個(gè)不相關(guān)的進(jìn)程訪問同一個(gè)邏輯內(nèi)存。共享內(nèi)存并未提供 同步機(jī)制,也就是說,在第一個(gè)進(jìn)程結(jié)束對(duì)共享內(nèi)存的寫操作之前,并無自動(dòng) 機(jī)制可以阻止第二個(gè)進(jìn)程開始對(duì)它進(jìn)行讀取。二、共享內(nèi)存的使得(內(nèi)容來自博客)與信號(hào)量一樣
2、,在Linux中也提供了一組函數(shù)接口用于使用共享內(nèi)存,而且使 用共享共存的接口還與信號(hào)量的非常相似,而且比使用信號(hào)量的接口來得簡(jiǎn)單。 它們聲明在頭文件sys/shm.h中。1、shmget 函數(shù)該函數(shù)用來創(chuàng)建共享內(nèi)存,它的原型為:int shmget(key_t key, size_t size, int shmflg)第一個(gè)參數(shù),與信號(hào)量的semget函數(shù)一樣,程序需要提供一個(gè)參數(shù)key (非0 整數(shù)),它有效地為共享內(nèi)存段命名,shmget函數(shù)成功時(shí)返回一個(gè)與key相關(guān) 的共享內(nèi)存標(biāo)識(shí)符(非負(fù)整數(shù)),用于后續(xù)的共享內(nèi)存函數(shù)。調(diào)用失敗返回-1. 不相關(guān)的進(jìn)程可以通過該函數(shù)的返回值訪問同一共享
3、內(nèi)存,它代表程序可能要 使用的某個(gè)資源,程序?qū)λ泄蚕韮?nèi)存的訪問都是間接的,程序先通過調(diào)用 shmget函數(shù)并提供一個(gè)鍵,再由系統(tǒng)生成一個(gè)相應(yīng)的共享內(nèi)存標(biāo)識(shí)符(shmget 函數(shù)的返回值),只有shmget函數(shù)才直接使用信號(hào)量鍵,所有其他的信號(hào)量函 數(shù)使用由semget函數(shù)返回的信號(hào)量標(biāo)識(shí)符。第二個(gè)參數(shù),size以字節(jié)為單位指定需要共享的內(nèi)存容量第三個(gè)參數(shù),shmflg是權(quán)限標(biāo)志,它的作用與open函數(shù)的mode參數(shù)一樣,如 果要想在key標(biāo)識(shí)的共享內(nèi)存不存在時(shí),創(chuàng)建它的話,可以與IPC_CREAT做或 操作。共享內(nèi)存的權(quán)限標(biāo)志與文件的讀寫權(quán)限一樣,舉例來說,0644,它表示允 許一個(gè)進(jìn)程創(chuàng)建
4、的共享內(nèi)存被內(nèi)存創(chuàng)建者所擁有的進(jìn)程向共享內(nèi)存讀取和寫入 數(shù)據(jù),同時(shí)其他用戶創(chuàng)建的進(jìn)程只能讀取共享內(nèi)存。2、shmat 函數(shù)第一次創(chuàng)建完共享內(nèi)存時(shí),它還不能被任何進(jìn)程訪問,shmat函數(shù)的作用就是 用來啟動(dòng)對(duì)該共享內(nèi)存的訪問,并把共享內(nèi)存連接到當(dāng)前進(jìn)程的地址空間。它 的原型如下:void *shmat(int shm_id, const void *shm_addr, int shmflg);第一個(gè)參數(shù),shm_id是由shmget函數(shù)返回的共享內(nèi)存標(biāo)識(shí)。第二個(gè)參數(shù),shm_addr指定共享內(nèi)存連接到當(dāng)前進(jìn)程中的地址位置,通常為空, 表示讓系統(tǒng)來選擇共享內(nèi)存的地址。第三個(gè)參數(shù),shm_flg是一
5、組標(biāo)志位,通常為0。調(diào)用成功時(shí)返回一個(gè)指向共享內(nèi)存第一個(gè)字節(jié)的指針,如果調(diào)用失敗返回-1.3、shmdt 函數(shù)該函數(shù)用于將共享內(nèi)存從當(dāng)前進(jìn)程中分離。注意,將共享內(nèi)存分離并不是刪除 它,只是使該共享內(nèi)存對(duì)當(dāng)前進(jìn)程不再可用。它的原型如下:int shmdt(const void *shmaddr);參數(shù)shmaddr是shmat函數(shù)返回的地址指針,調(diào)用成功時(shí)返回0,失敗時(shí)返回- 1.4、shmctl 函數(shù)與信號(hào)量的semctl函數(shù)一樣,用來控制共享內(nèi)存,它的原型如下: int shmctl(int shm_id, int command, struct shmid_ds *buf);第一個(gè)參數(shù),s
6、hm_id是shmget函數(shù)返回的共享內(nèi)存標(biāo)識(shí)符。第二個(gè)參數(shù),command是要采取的操作,它可以取下面的三個(gè)值:IPC_STAT: 把shmid_ds結(jié)構(gòu)中的數(shù)據(jù)設(shè)置為共享內(nèi)存的當(dāng)前關(guān)聯(lián)值,即用共享內(nèi)存的當(dāng)前 關(guān)聯(lián)值覆蓋shmid_ds的值。IPC_SET :如果進(jìn)程有足夠的權(quán)限,就把共享內(nèi)存的當(dāng)前關(guān)聯(lián)值設(shè)置為shmid_ds結(jié)構(gòu)中給出的值IPC_RMID :刪除共享內(nèi)存段第三個(gè)參數(shù),buf是一個(gè)結(jié)構(gòu)指針,它指向共享內(nèi)存模式和訪問權(quán)限的結(jié)構(gòu)。shmid_ds結(jié)構(gòu)至少包括以下成員:struct shmid_dsuid_t shm_perm.uid;uid_t shm_perm.gid;mode
7、_t shm_perm.mode;三、共享內(nèi)存的使用#include #include #include #include #define MY_SHM_ID 67483int main()獲得系統(tǒng)中頁(yè)面的大小printf( page size=%dn,getpagesize();創(chuàng)建一個(gè)共享內(nèi)存區(qū)段intshmid,ret;shmid=shmget( MY_SHM_ID,4096,0666|IPC_CREAT );創(chuàng)建了一個(gè)4KB大小共享內(nèi)存區(qū)段。指定的大小必須是當(dāng)前系統(tǒng)中頁(yè)面大小的整數(shù)倍if(shmid0 )printf( Create a shared memory segment %d
8、n,shmid );獲得一個(gè)內(nèi)存區(qū)段的信息structshmid_dsshmds;/shmid=shmget( MY_SHM_ID,0,0 );/示例怎樣獲得一個(gè)共享內(nèi)存的標(biāo)識(shí)符 ret=shmctl( shmid,IPC_STAT,&shmds );if( ret=0 )printf( Size of memory segment is %dn,( int )shmds.shm_segsz );printf( Numbre of attaches %dn,( int )shmds.shm_nattch );elseprintf( shmctl( ) call failedn);刪除該共享內(nèi)存
9、區(qū)ret=shmctl( shmid,IPC_RMID,0 );if( ret=0 )printf( Shared memory removed n);elseprintf( Shared memory remove failed n);return 0;X _ 口終端文件(F)編輯(E)查看(V)搜索(S)終端(T)幫助(H) hoohoo-Inspi.ron-5547:-$ gcc memory.c -o memory -Im hoo0hoo-Inspiron-5547:$ ./memory page size=4096Create a shared memory segment 3407
10、882Size of memory segment is 4096Numbre of attaches 0Shared memory removedhoo0hoo-Inspiron-5547:$ |#include #include #include #include #include #include #define SIZE 1024 int main() intshmid ;char *shmaddr ; structshmid_dsbuf ;int flag = 0 ;intpid ;shmid = shmget(IPC_PRIVATE, SIZE, IPC_CREAT|0600 );
11、if ( shmid 0)sleep(3 );flag = shmctl( shmid, IPC_STAT, &buf);if ( flag = -1 )perror(shmctlshm error);return -1 ;printf(shm_segsz =%d bytesn, (int)buf.shm_segsz );printf(parent pid=%d, shm_cpid = %d n, (int)getpid(), (int)buf.shm_cpid );printf(chlidpid=%d, shm_lpid = %d n,(int)pid , (int)buf.shm_lpid
12、 );shmaddr = (char *) shmat(shmid, NULL, 0 );if ( *(int*)shmaddr = -1 )perror(shmataddr error);return -1 ;printf(%s, shmaddr);shmdt(shmaddr );shmctl(shmid, IPC_RMID, NULL);elseperror(fork error);shmctl(shmid, IPC_RMID, NULL);return 0;#include #include #include #include #include #include #include #de
13、fine MY_SHM_ID 34325#define MY_SEM_ID 23234#define MAX_STRING 10typedefstructintsemID;int counter;char string MAX_STRING+1 ;MY_BLOCK_T;int main(intargc,char* argv)intshmid,ret,i;MY_BLOCK_T* block;structsembufsb;char user;/make sure there is a commandif(argc=2 )/create the shared memory segment and i
14、nit it/with the semaphoreif( !strncmp(argv 1 ,create,6)/create the shared memory segment and semaphore printf( Creating the shared memoryn);shmid=shmget( MY_SHM_ID,sizeof( MY_BLOCK_T ),( IPC_CREAT|0666 );block=( MY_BLOCK_T* )shmat( shmid,( const void* )0,0 ); block-counter=0;/create the semaphore an
15、d init block-semID=semget(MY_SEM_ID,1,( IPC_CREAT|0666 ); sb.sem_num=0;sb.sem_op=1;sb.sem_flg=0;semop( block-semID,&sb,1 );/now detach the segment shmdt( ( void* )block );printf( Create the shared memory and semaphore successufllyn); else if( !strncmp(argv 1 ,use,3)/*use the segment*/must specify al
16、so a letter to write to the buffer if(argc3 ) exit( -1 );user=( char )argv 2 0 ;/grab the segment shmid=shmget( MY_SHM_ID,0,0 );block=( MY_BLOCK_T* )shmat( shmid,( const void* )0,0 );/*#重點(diǎn)就是使用旗語(yǔ)對(duì)共享區(qū)的訪問#*/ for(i=0;isemID,&sb,1 )!=-1 )/write the letter to the segment buffer/this is our CRITICAL SECTIO
17、N block-string block-counter+ =user;sb.sem_num=0;sb.sem_op=1;sb.sem_flg=0;if(semop( block-semID,&sb,1 )=-1 ) printf( Failed to release the semaphoren);elseprintf( Failed to acquire the semaphoren);/do some clear work ret=shmdt( void*)block);else if( !strncmp(argv 1 ,read,4)/here we will read the buf
18、fer in the shared segment shmid=shmget( MY_SHM_ID,0,0 );if(shmid!=-1 )block=( MY_BLOCK_T* )shmat( shmid,( const void* )0,0 ); block-string block-counter+1 =0;printf( %sn,block-string );printf( Lengteah=%dn,block-counter );ret=shmdt( ( void*)block );elseprintf( Unable to read segmentn);else if( !strn
19、cmp(argv 1 ,remove,6)shmid=shmget( MY_SHM_ID,0,0 );if(shmid=0 )block=( MY_BLOCK_T* )shmat( shmid,( const void* )0,0 );/remove the semaphoreret=semctl( block-semID,0,IPC_RMID );if( ret=0 )printf( Successfully remove the semaphore n);/remove the shared segment ret=shmctl( shmid,IPC_RMID,0 );if( ret=0 ) printf( Successfully remove the segment n);elseprintf( Unkonw commandn);return 0;X _ 口終端文件(F)編輯(E)查看(V)貿(mào)索(S)終端(T)幫助(H)hoohoo-Insptron-5547:$ gcc memory3.c -o m3 hoo0hoo-Inspiron-5547:$ ./m3 create Creating the shared memoryCreate the sha
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年城市綠地養(yǎng)護(hù)保潔服務(wù)合同3篇
- 溫州肯恩大學(xué)《AM技術(shù)及應(yīng)用》2023-2024學(xué)年第一學(xué)期期末試卷
- 二零二五年度跨境電商供應(yīng)鏈融資擔(dān)保協(xié)議書3篇
- 二零二五版廢鐵貿(mào)易結(jié)算與倉(cāng)儲(chǔ)服務(wù)合同3篇
- 二零二五年金融租賃擔(dān)保協(xié)議與保證合同規(guī)范2篇
- 2025年度特色小吃街加盟經(jīng)營(yíng)合同范本3篇
- 2025年度電影項(xiàng)目投資與回報(bào)分成協(xié)議3篇
- 2024文化藝術(shù)品交易平臺(tái)建設(shè)與運(yùn)營(yíng)協(xié)議
- 2024版保安勞動(dòng)合同書范本
- 2025年度化學(xué)原料藥廢棄物處理與資源化利用合同3篇
- 2024年計(jì)算機(jī)二級(jí)WPS考試題庫(kù)(共380題含答案)
- 《湖南省房屋建筑和市政工程消防質(zhì)量控制技術(shù)標(biāo)準(zhǔn)》
- 中建集團(tuán)面試自我介紹
- 《工業(yè)園區(qū)節(jié)水管理規(guī)范》
- 警校生職業(yè)生涯規(guī)劃
- 意識(shí)障礙患者的護(hù)理診斷及措施
- 2024版《53天天練單元?dú)w類復(fù)習(xí)》3年級(jí)語(yǔ)文下冊(cè)(統(tǒng)編RJ)附參考答案
- 2025企業(yè)年會(huì)盛典
- 215kWh工商業(yè)液冷儲(chǔ)能電池一體柜用戶手冊(cè)
- 場(chǎng)地平整施工組織設(shè)計(jì)-(3)模板
- 交通設(shè)施設(shè)備供貨及技術(shù)支持方案
評(píng)論
0/150
提交評(píng)論