1、概述
posix提供了兩種在無親緣關係程序間共享記憶體區的方法:
者兩種方法多需要呼叫mmap,差別在於作為mmap的引數之一的描述符的獲取手段。
2、posix共享記憶體區物件
posix共享記憶體區涉及以下兩個步驟要求:
(1)指定乙個名字引數呼叫shm_open,以建立乙個新的共享記憶體區物件或開啟乙個已經存在的共享記憶體區物件。
(2)呼叫mmap把這個共享記憶體區對映到呼叫程序的位址空間。
關於posix共享記憶體區物件的api如下:
#include #include /* for mode constants */
#include /* for o_* constants */
int shm_open(const char *name, int oflag, mode_t mode);
int shm_unlink(const char *name);
int ftruncate(int fd, off_t length);
int fstat(int fd, struct stat *buf);
(1)指定名字和長度建立乙個共享記憶體區物件,程式如下:
#include #include #include #include #include #define file_mode (s_irusr | s_iwusr | s_irgrp | s_iroth)
int main(int argc,char* argv)
}if(optind != argc -2)
length = atoi(argv[optind + 1]);
fd = shm_open(argv[optind],flags,file_mode);
ftruncate(fd,length);
ptr = mmap(null,length,prot_read | prot_write ,map_shared,fd,0);
exit(0);
}
(2)從系統中刪除乙個共享記憶體區物件的名字,程式如下:
#include #include #include #include #include #include int main(int argc,char* argv)
if(shm_unlink(argv[1]) == -1)
exit(0);
}
(3)往共享記憶體區物件中寫入乙個模式,程式如下:
#include #include #include #include #include #include #define file_mode (s_irusr | s_iwusr | s_irgrp | s_iroth)
int main(int argc,char *argv)
fd = shm_open(argv[1],o_rdwr,file_mode); //開啟所指定的共享記憶體區物件
fstat(fd,&stat); //獲取記憶體區的大小
ptr = mmap(null,stat.st_size,prot_read | prot_write,map_shared,fd,0); //對映到共享記憶體區
close(fd);
for(i=0;i#include #include #include #include #include #include #include #include #define file_mode (s_irusr|s_iwusr|s_irgrp|s_iroth)
//計數器結構體
struct shmstruct
;//同步有名訊號量
sem_t *mutex;
int main(int argc,char *argv)
//防止所需共享記憶體區物件已經存在
shm_unlink(argv[1]);
//建立乙個新的共享記憶體區物件
if((fd = shm_open(argv[1],o_rdwr | o_creat | o_excl,file_mode)) == -1)
//指定新建立的共享記憶體區物件的大小
ftruncate(fd,sizeof( struct shmstruct));
//將新建立的共享記憶體區對映到呼叫程序的位址空間
if((ptr = mmap(null,sizeof(struct shmstruct),prot_read | prot_write,map_shared,fd,0)) == map_failed)
//關閉物件描述符
close(fd);
//防止所需的訊號量已經存在
sem_unlink(argv[2]);
//建立有名訊號量,作為互斥鎖用
if((mutex = sem_open(argv[2],o_creat|o_excl,file_mode,1)) == sem_failed)
//關閉訊號量
sem_close(mutex);
exit(0);
}
給存放在共享記憶體區中的乙個計數器加1程式如下:client1.c
#include #include #include #include #include #include #include #include #include #define file_mode (s_irusr|s_iwusr|s_irgrp|s_iroth)
struct shmstruct
;sem_t *mutex;
int main(int argc,char *argv)
nloop = atoi(argv[3]);
//開啟共享記憶體區
if((fd = shm_open(argv[1],o_rdwr,file_mode)) == -1)
//將共享記憶體區對映到程序位址空間
if((ptr = mmap(null,sizeof(struct shmstruct),prot_read | prot_write,map_shared,fd,0)) == map_failed)
close(fd);
//開啟訊號量
if((mutex = sem_open(argv[2],0)) == sem_failed)
pid = getpid();
for(i=0;icount++);
sem_post(mutex); //釋放訊號量
}exit(0);
}
Posix共享記憶體區
posix提供了兩種在無親緣關係程序間共享記憶體區的方法 2 共享記憶體區物件 先有shm open開啟乙個posix ipc名字 也可以是檔案系統中的乙個路徑名 然後呼叫mmap將返回的描述符對映到當前程序的位址空間。者兩種方法多需要呼叫mmap,差別在於作為mmap的引數之一的描述符的獲取手段。...
第13章 Posix共享記憶體區
原始碼目錄 include include for mode constants include for o constants intshm open const char name,int oflag,mode t mode int shm unlink const char name link...
POSIX共享記憶體
本文參考 嵌入式linux開發教程 和 linux unix系統程式設計手冊 共享記憶體是允許兩個不相關的程序訪問同乙個邏輯記憶體的程序間通訊方法,是在兩個正在執行的程序之間共享和傳遞資料的一種非常有效的方式。不同程序之間的共享記憶體通常安排為同一段物理記憶體。程序可以將同一段共享記憶體連線到它們自...