溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Posix共享內(nèi)存

發(fā)布時間:2020-06-10 16:12:22 來源:網(wǎng)絡(luò) 閱讀:648 作者:栗先生 欄目:網(wǎng)絡(luò)安全

    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

向AI問一下細節(jié)

免責(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)容。

AI