91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

霞浦县| 工布江达县| 廊坊市| 射洪县| 昌吉市| 改则县| 新津县| 东宁县| 东安县| 威宁| 平原县| 灵寿县| 那坡县| 蛟河市| 忻城县| 云浮市| 大竹县| 武邑县| 溧阳市| 栖霞市| 黄冈市| 罗山县| 乃东县| 万宁市| 天长市| 新绛县| 同心县| 西林县| 桐乡市| 城步| 泸州市| 阜新市| 若羌县| 许昌市| 佛教| 贵阳市| 五寨县| 衡山县| 镇坪县| 河北区| 乌兰察布市|