您好,登錄后才能下訂單哦!
Posix共享內(nèi)存涉及以下兩個步驟:
1、指定一個名字參數(shù)調(diào)用shm_open,以創(chuàng)建以一個新的共享內(nèi)存區(qū)對象或打開一個已存在的共享內(nèi)存區(qū)對象。
2、調(diào)用mmap把這個共享內(nèi)存區(qū)映射到調(diào)用進程的地址空間。
頭文件:
#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參數(shù)是O_CRTEA|O_RDWR等標志;
mode參數(shù)指定權(quán)限位如果沒有指定O_CREAT標志,那么該參數(shù)可以指定為0。(如果是創(chuàng)建的話權(quán)限要給夠,平常是0644的權(quán)限,否則別的進程可能沒有權(quán)限)。
一般創(chuàng)建的文件是自動放在/dev/shm/的目錄下的。
新創(chuàng)建的文件大小一般為0,所以mmap函數(shù)調(diào)用文件標識符的時候會出錯,這時候要用ftruncate()函數(shù)擴大文件
#include<unistd.h>
int ftruncate(int fd,off_t length); 成功返回0,出錯返回-1
對于一個普通文件:如果該文件的大小大于length參數(shù),額外的數(shù)據(jù)就會被丟掉。
對于一個共享內(nèi)存區(qū)對象:把該對象的大小設(shè)置成length字節(jié)。
當(dāng)打開一個已存在的共享內(nèi)存對象時,我們可以調(diào)用fstat來獲取有關(guān)該對象的信息。
#include<sys/types.h>
#include<sys/stat.h>
int fstat(int fd, struct stat *buf);
stat結(jié)構(gòu)有12個或以上的成員, 但當(dāng)fd指代一個共享內(nèi)存區(qū)對象時,只有四個成員含有信息。
struct stat{
mode_t st_mode;
uid_t st_uid;
gid_t st_gid;
off_t st_size;
};
調(diào)用時不用定義這個結(jié)構(gòu)體,直接實例化就行了,如:struct stat sta;
下面是兩個例子,一個是向共享內(nèi)存里寫,一個讀取;
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); }
執(zhí)行:./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); }
執(zhí)行:
./write mmap.txt aaa bbb ccc
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。