一 共享內(nèi)存
共享內(nèi)存是由IPC為進(jìn)程創(chuàng)建的一個(gè)特殊的地址范圍,它將出現(xiàn)在該進(jìn)程的地址空間中。其他進(jìn)程可以將同一段共享內(nèi)存連接到它們自己的地址空間中,所有進(jìn)程都可以訪問共享內(nèi)存中的地址。如果某個(gè)進(jìn)程向共享內(nèi)存寫入了數(shù)據(jù),所做的改動(dòng)將立刻被可以訪問同一段共享內(nèi)存的任何其他進(jìn)程看到。
二 相關(guān)函數(shù)
#include <sys/shm.h>
/ / shmget創(chuàng)建共享內(nèi)存 int shmget(key_t key, //為共享內(nèi)存段命名
size_t size, //以字節(jié)為單位指定需要共享的內(nèi)存容量
int shmflg //權(quán)限標(biāo)志。允許一個(gè)進(jìn)程創(chuàng)建的共享內(nèi)存可以被共享內(nèi)存的創(chuàng)建者所擁有的進(jìn)程寫入,同時(shí)其他用戶創(chuàng)建的進(jìn)程只能讀取該共享內(nèi)存。
); //如果共享內(nèi)存創(chuàng)建成功,返回一個(gè)非負(fù)整數(shù),即共享內(nèi)存標(biāo)識(shí)符,如果失敗,就返回-1
//shmat將共享內(nèi)存連接它在程序進(jìn)入臨界區(qū)域時(shí)設(shè)置信號(hào)量到一個(gè)進(jìn)程的地址空間中
void *shmat( int shm_id, //由shmget返回的共享內(nèi)存標(biāo)識(shí)符
const void *shm_addr, //指定的是共享內(nèi)存連接到當(dāng)前進(jìn)程中的地址位置,它通常是一個(gè)空指針,表示讓系統(tǒng)來選擇共享內(nèi)存出現(xiàn)的地址
int shmflg //一組位標(biāo)志。通常設(shè)為0,讓系統(tǒng)來選擇一個(gè)地址,否則就會(huì)使應(yīng)用程序?qū)τ布囊蕾囆赃^高
); //如果調(diào)用成功,返回一個(gè)指向共享內(nèi)存第一個(gè)字節(jié)的指針,如果失敗,返回-1
//shmctl控制共享內(nèi)存 int shmctl( int shm_id, //shmget返回的共享內(nèi)存標(biāo)識(shí)符
int cmd, //要采取的動(dòng)作,可以取3個(gè)值: IPC_STAT,IPC_SET,IPC_RMID
struct shmid_ds * buf //是一個(gè)指向包含共享內(nèi)存模式和訪問權(quán)限的結(jié)構(gòu)
); //成功時(shí)返回0,失敗時(shí)返回-1
//shmdt將共享內(nèi)存從當(dāng)前進(jìn)程中分離 int shmdt( const void * shm_addr); //參數(shù)是shmat返回的地址指針。成功時(shí)返回0,失敗時(shí)返回-1
?shmctl中第二個(gè)參數(shù)的取值:
IPC_STAT:把shmid_ds結(jié)構(gòu)中的數(shù)據(jù)設(shè)置為共享內(nèi)存的當(dāng)前關(guān)聯(lián)值
IPC_SET:如果進(jìn)程有足夠的權(quán)限,就把共享內(nèi)存的當(dāng)前關(guān)聯(lián)值設(shè)置為shmid_ds結(jié)構(gòu)中給出的值
IPC_RMID:刪除共享內(nèi)存段
struct
shmid_ds{ uid_t shm_perm.uid; uid_t shm_perm.gid; mode_t shm_perm.mode; }
?
三 例子
shm_com.h
#define TEXT_SZ 2048 struct shared_use_st{ int written_by_you; char some_text[TEXT_SZ]; };
shm1.c
#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include < string .h> #include <sys/shm.h> #include " shm_com.h " int main(){ int running = 1 ; void *shared_memory=( void *) 0 ; struct shared_use_st * shared_stuff; int shmid; srand((unsigned int )getpid()); shmid =shmget((key_t) 1234 , sizeof ( struct shared_use_st), 0666 | IPC_CREAT); if (shmid==- 1 ){ fprintf(stderr, " shmget failed\n " ); exit(EXIT_FAILURE); } // 現(xiàn)在可以讓程序訪問這個(gè)共享內(nèi)存 shared_memory=shmat(shmid,( void *) 0 , 0 ); if (shared_memory==( void *)- 1 ){ fprintf(stderr, " shmat failed\n " ); exit(EXIT_FAILURE); } printf( " Memory attached at %X\n " ,( int )shared_memory); // 將shared_memory分配給shared_stuff,然后它輸出written_by_you中的文本 shared_stuff=( struct shared_use_st * )shared_memory; shared_stuff ->written_by_you= 0 ; while (running){ if (shared_stuff-> written_by_you){ printf( " You wrote:%s " ,shared_stuff-> some_text); sleep(rand() % 4 ); shared_stuff ->written_by_you= 0 ; if (strncmp(shared_stuff->some_text, " end " , 3 )== 0 ){ running = 0 ; } } } if (shmdt(shared_memory)==- 1 ){ fprintf(stderr, " shmdt failed\n " ); exit(EXIT_FAILURE); } if (shmctl(shmid,IPC_RMID, 0 )==- 1 ){ fprintf(stderr, " shmctl(IPC_RMID) failed\n " ); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); }
shm2.c
#include <stdio.h> #include <stdlib.h> #include < string .h> #include <unistd.h> #include <sys/shm.h> #include " shm_com.h " int main(){ int running= 1 ; void *shared_memory=( void *) 0 ; struct shared_use_st * shared_stuff; char buffer[BUFSIZ]; int shmid; shmid =shmget((key_t) 1234 , sizeof ( struct shared_use_st), 0666 | IPC_CREAT); if (shmid==- 1 ){ fprintf(stderr, " shmget failed\n " ); exit(EXIT_FAILURE); } shared_memory =shmat(shmid,( void *) 0 , 0 ); if (shared_memory==( void *)- 1 ){ fprintf(stderr, " shmat failed\n " ); exit(EXIT_FAILURE); } printf( " Memory attached at %X\n " ,( int )shared_memory); shared_stuff =( struct shared_use_st * )shared_memory; while (running){ while (shared_stuff->written_by_you== 1 ){ sleep( 1 ); printf( " Waiting for client...\n " ); } printf( " Enter some text: " ); fgets(buffer,BUFSIZ,stdin); strncpy(shared_stuff -> some_text,buffer,TEXT_SZ); shared_stuff ->written_by_you= 1 ; if (strncmp(buffer, " end " , 3 )== 0 ){ fprintf(stderr, " shmdt failed\n " ); exit(EXIT_FAILURE); } } if (shmdt(shared_memory)==- 1 ){ fprintf(stderr, " shmdt failed\n " ); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); }
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
