您好,登錄后才能下訂單哦!
Posix共享內存涉及以下兩個步驟:
1、指定一個名字參數調用shm_open,以創建以一個新的共享內存區對象或打開一個已存在的共享內存區對象。
2、調用mmap把這個共享內存區映射到調用進程的地址空間。
頭文件:
#include<sys/mman.h>
#include<sys/stat.h>
#include<fcntl.h>
int shm_open(const char *name, int oflag, mode_t mode);
int shm_unlink(const char *name);
Link with -lrt(要注意連接這個庫)
oflag參數是O_CRTEA|O_RDWR等標志;
mode參數指定權限位如果沒有指定O_CREAT標志,那么該參數可以指定為0。(如果是創建的話權限要給夠,平常是0644的權限,否則別的進程可能沒有權限)。
一般創建的文件是自動放在/dev/shm/的目錄下的。
新創建的文件大小一般為0,所以mmap函數調用文件標識符的時候會出錯,這時候要用ftruncate()函數擴大文件
#include<unistd.h>
int ftruncate(int fd,off_t length); 成功返回0,出錯返回-1
對于一個普通文件:如果該文件的大小大于length參數,額外的數據就會被丟掉。
對于一個共享內存區對象:把該對象的大小設置成length字節。
當打開一個已存在的共享內存對象時,我們可以調用fstat來獲取有關該對象的信息。
#include<sys/types.h>
#include<sys/stat.h>
int fstat(int fd, struct stat *buf);
stat結構有12個或以上的成員, 但當fd指代一個共享內存區對象時,只有四個成員含有信息。
struct stat{
mode_t st_mode;
uid_t st_uid;
gid_t st_gid;
off_t st_size;
};
調用時不用定義這個結構體,直接實例化就行了,如:struct stat sta;
下面是兩個例子,一個是向共享內存里寫,一個讀取;
read:
#include<stdio.h> #include<unistd.h> #include<sys/mman.h> #include<fcntl.h> #include<string.h> #include<sys/stat.h> int main(int argc,char* argv[]) { int fd = shm_open(argv[1],O_RDONLY,0); void* buf = NULL; if((buf = mmap(NULL,BUFSIZ,PROT_READ,MAP_SHARED,fd,0)) ==MAP_FAILED ){ perror("mmap error\n"); return 1; } sleep(1); while(1){ printf("read:%s\n",buf); sleep(3); } munmap(buf,BUFSIZ); close(fd); }
執行:./read mmap.txt
write:
#include<stdio.h> #include<unistd.h> #include<sys/mman.h> #include<fcntl.h> #include<string.h> #include<sys/stat.h> int main(int argc,char* argv[]) { int fd = shm_open(argv[1],O_CREAT|O_RDWR,0644); if(fd == -1){ perror("shm_open error\n"); return 1; } ftruncate(fd,100); void* buf = NULL; if((buf = mmap(NULL,BUFSIZ,PROT_WRITE,MAP_SHARED,fd,0))== MAP_FAILED){ perror("mmap error\n"); return 1; } int i; for(i=2;i<argc;i++){ strcpy(buf,argv[i]); sleep(3); } munmap(buf,BUFSIZ); close(fd); }
執行:
./write mmap.txt aaa bbb ccc
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。