亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

Posix共享內存

發布時間:2020-06-10 16:12:22 來源:網絡 閱讀:649 作者:栗先生 欄目:網絡安全

    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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

滨海县| 巴彦县| 德清县| 东港市| 巫山县| 井冈山市| 姚安县| 海丰县| 达拉特旗| 隆尧县| 嘉祥县| 什邡市| 开鲁县| 桂平市| 宜兰县| 鹤壁市| 水城县| 炉霍县| 大洼县| 南昌市| 松溪县| 璧山县| 沅陵县| 德保县| 平和县| 克山县| 调兵山市| 安泽县| 内丘县| 和林格尔县| 台湾省| 九龙坡区| 浦城县| 通州区| 禹城市| 大同市| 屏山县| 山西省| 克山县| 甘谷县| 阳泉市|