日韩av色在线_av不卡在线观看_亚洲国产精品第一页_在线看日本不卡_色成人综合网_国产丝袜在线视频_国产精成人品localhost_国产91富婆露脸刺激对白_韩国视频一区_国产精品人成电影

Hi,歡迎來到嵌入式培訓高端品牌 - 華清遠見教育科技集團<北京總部官網>,專注嵌入式工程師培養15年!
當前位置: > 華清遠見教育科技集團 > 嵌入式學習 > 講師博文 > ShareMem
ShareMem
時間:2017-01-05作者:華清遠見

前幾天上進程間通訊的課程,看到有同學對共享內存有些不是很明白,而且在查man幫助的時候也不是很能明白系統對其的說明,故有了這篇文章。

共享內存是系統在做進程間通訊時比較常用的IPC通訊方式之一,同時也是效率高的,但是由于其的獨特性導致在使用共享內存的時候需要注意一點就是幾個進程間通訊時的互斥和同步問題,所以在使用共享內存的時候,我們一般要對其加鎖或者加一些其他的同步機制,比如信號燈之類的。

首先看下共享內存的數據結構:

共享內存區的數據結構

每個共享內存段在內核中維護著一個內部結構shmid_ds,該結構定義在linux/shm.h中,代碼如下所示:

struct shmid_ds {
        struct ipc_perm shm_perm;/* 超作許可權數據結構指針 */
                int         shm_segsz;        /* 共享存儲段大小 (bytes) */
                time_t         shm_atime;        /* 后調用shmat時間 */
                time_t        shm_dtime;         /* 后調用shmdt的時間 */
                time_t        shm_ctime;        /* 后調用shmctl的改變的時間 */
                unsigned short        shm_cpid;        /*創建者的進程ID */
                unsigned short        shm_lpid;        /* 后對共享存儲段進行操作的進程ID */
                short        shm_nattch;        /* 當前連接數 */
        };

共享內存的創建和操作

A:共享內存區的創建

linux下使用函數shmget來創建一個共享內存區,或者訪問一個已經存在的共享內存區,該函數定義如下:

#include <sys/ipc.h>
        #include <sys/shm.h>

int shmget(key_t key, size_t size, int shmflg);

返回:失敗-1, 成功返回非負的共享存儲段id。

第一個參數key是共享存儲關鍵字。它有特殊值IPC_PRIVATE表示總是創建一個進程私有的共享存儲段。當key值不等于IPC_PRIVATE時,shmget動作取決于后一個參數shmflg標志:

1. IPC_CREAT 單獨設置此標志,當系統中不存在相同key時,創建一個新的共享存儲段,否則返回已存在的共享存儲段。
        2. IPC_EXCL 單獨設置不起作用。與 IPC_CREAT同時設置時,當系統中存在相同key時,錯誤返回。保證不會打開一個已存在的共享存儲段。

如果沒有指定IPC_CREATE并且系統中不存在相同key值的共享存儲段,將失敗返回。

第二個參數size指明要求的共享存儲段的大小。當key指定的共享存儲段已存在時,取值范圍為0和已存在共享段大小;蚝唵沃付0。成功后此函數返回共享存儲段id,同時創建于參數key相連的數據結構shmid_ds。此節構為系統內部使用。

第三個參數也可以設置共享存儲段的訪問權限,用或于上面的值操作。

B:共享內存區的操作

在使用共享內存區之前,必須通過shmat函數將其附加到進程的地址空間,進程和地址空間就建立了連接。shmat調用成功后就返回一個共享內存區指針,使用該指針就可以訪問共享內存區了。

#include <sys/types.h>
        #include <sys/shm.h>

void *shmat(int shmid, const void *shmaddr, int shmflg);

返回:失敗-1并置errno, 成功返回連接的實際地址。

第一個參數,必須由shmget返回的存儲段的id。

第二個參數指明共享存儲段要連接到的地址。0,系統為我們創建一個適當的地址值。否則自己指定。

第三個參數shmflg可以設成:SHM_RND, SHM_RDONLY。SHM_RND為自己指定連接地址時用。SHM_RDONLY說明此存儲段只讀。

當進程結束使用共享內存區時,就要通過函數shmdt斷開于共享內存區的連接。函數介紹如下:

#include <sys/types.h>
        #include <sys/shm.h>

int shmdt(const void * shmaddr);

返回:失敗-1并置errno, 成功返回0

分離由shmaddr指定的存儲段。此值應該由shmat返回的值。
        此函數不是刪除共享存儲段,而是從當前進程分離存儲段。
        當進程推出時,系統會自動分離它連接的所有共享段。

共享內存區的控制
        #include <sys/ipc.h>
        #include <sys/shm.h>

int shmctl(int shmid, int cmd, struct shmid_ds *buf);

存儲段控制函數?色@得shmid_ds全部內容。

返回:失敗-1并置errno, 成功返回0。

第一個參數,必須由shmget返回的存儲段的id。cmd為指定要求的操作。

CMD 說明 參數
        IPC_STAT          放置與shmid相連的shmid_ds結構當前值于buf所指定用戶區 buf
        IPC_SET          用buf指定的結構值代替與shmid相連的shmid_ds結構值 buf
        IPC_RMID          刪除制定的信號量集合 
        SHM_LOCK          鎖住共享存儲段。只能由超級管理員使用 
        SHM_UNLOCK          unlock共享存儲段。只能由超級管理員使用

附例子:
        #include <stdio.h>
         #include <stdlib.h>
        #include <unistd.h>
        #include <sys/types.h>
        #include <sys/ipc.h>
        #include <sys/sem.h>
        #include <sys/shm.h>
        #include <errno.h>

#define SHM_SIZE 1024
        union semun 
        {
                int val;
                struct semid_ds *buf;
                unsigned short *array;
};

/*創建信號量函數*/
        int createsem (const char *pathname,int proj_id,int members,int init_val)
        {
                key_t msgkey;
                int index,sid;
                union semun semopts;
                if ((msgkey = ftok(pathname,proj_id)) == -1) {
                        perror ("ftok error1\n");
                        return -1;
                }

        if ((sid = semget (msgkey,members,IPC_CREAT |0666)) == -1) {
                        perror("semget call failed!");
                        return -1;
                }

        /*初始化操作*/
                semopts.val = init_val;
                for (index = 0;index < members; index ++){
                        semctl(sid,index,SETVAL,semopts);
                }
                return (sid);
        }

/*打開信號量函數*/
        int opensem (const char *pathname,int proj_id)
        {
                key_t msgkey;
                int sid;

                if ((msgkey = ftok(pathname,proj_id)) == -1) {
                        perror ("ftok error1\n");
                        return -1;
                }

        if ((sid = semget (msgkey,0,IPC_CREAT |0666)) == -1) {
                perror("semget call failed!");
                return -1;
                }

        return (sid);
        }

/*P操作函數*/
        int sem_p(int semid,int index)
        {
                struct sembuf buf = {0,-1,IPC_NOWAIT};
                if (index < 0) {
                        perror("index of array can not equals a minus value!");
                        return -1;
                }
                buf.sem_num = index;
                if (semop(semid ,&buf,1) == -1) {
                        perror("a wrong operations to semaphore occured!");
                        return -1;
                }
                return 0;
        }

/*V操作函數*/
        int sem_v(int semid,int index)
        {
                struct sembuf buf = {0,+1,IPC_NOWAIT};
                if (index < 0) {
                        perror("index of array can not equals a minus value!");
                        return -1;
                }
                buf.sem_num = index;
                if (semop(semid ,&buf,1) == -1) {
                        perror("a wrong operations to semaphore occured!");
                        return -1;
                }
                return 0;
        }

/*刪除信號集函數*/
        int sem_delete(int semid)
        {
                return (semctl(semid,0,IPC_RMID));
        }

/*等待信號集函數*/
        int wait_sem (int semid,int index)
        {
                while (semctl(semid,index,GETVAL,0) == 0) {
                        sleep(1);
                }
                return 1;
        }

/*創建共享內存函數*/
        int createshm(char * pathname,int proj_id,size_t size)
        {
                key_t shmkey;
                int sid;
                /*獲取鍵值*/
                if ((shmkey = ftok(pathname,proj_id)) == -1 ) {
                        perror("shmkey ftok error! \n");
                        return -1;
                }

        if ((sid = shmget(shmkey,size,IPC_CREAT | 0666)) == -1) {
                        perror("shmget call failed!\n");
                        return -1;
                }
                return (sid);
        }

/* Write.c */
        #include <string.h>
        #include "sharemem.h"
        int main(void)
        {
                int semid,shmid;
                char *shmaddr;
                char write_str[SHM_SIZE];
                if ((shmid = createshm(".",'m',SHM_SIZE)) == -1) {
                        exit (1);
                }

        if ((shmaddr = shmat(shmid,(char*)0,0)) == (char *)-1) {
                        perror("attach shared memory error!\n");
                        exit (1);
                }

        if ((semid = createsem(".",'s',1,1)) == -1) {
                        exit(1);
                }

        while(1) {
                        wait_sem(semid,0);
                        sem_p(semid,0);

                printf("write:");
                        fgets(write_str,1024,stdin);
                int len = strlen(write_str) -1;
                        write_str[len] = '\0';
                        strcpy(shmaddr,write_str);
                        sleep(2); /*使reader處于阻塞狀態*/
                        sem_v(semid,0); /*v操作*/
                        sleep(2); /*等待reader進行讀操作*/
                }
                return 0;
        }

/* Read.c */
        #include "sharemem.h"
        int main(void)
        {
                int semid,shmid;
                char *shmaddr;
                char write_str[SHM_SIZE];
                if ((shmid = createshm(".",'m',SHM_SIZE)) == -1) {
                        exit (1);
                }

        if ((shmaddr = shmat(shmid,(char*)0,0)) == (char *)-1) {
                        perror("attach shared memory error!\n");
                        exit (1);
                }

        if ((semid = opensem(".",'s')) == -1) {
                        exit(1);
                }

        while(1) {
                        printf("reader:");
                        wait_sem(semid,0); /*等待信號值為1*/
                        sem_p(semid,0);

                printf("%s\n",shmaddr);
                        sleep(2); /*使writer處于阻塞狀態*/
                        sem_v(semid,0); /*v操作*/
                        sleep(2); /*等待write進行寫操作*/
                }
                return 0;
        }

發表評論
評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
裸模一区二区三区免费| 伊人影院中文字幕| 熟妇熟女乱妇乱女网站| 久久国产精品影片| 欧美精品一卡两卡| 中文字幕av不卡| 一本色道久久精品| 99这里只有精品视频| 久久亚洲天堂| 老司机性视频| 国产精品被窝福利一区| 又骚又黄的视频| 日本美女黄色一级片| 色婷婷综合网站| 中文字幕在线亚洲三区| 国产在线精品播放| 超碰精品一区二区三区乱码| 欧美日韩日日骚| 亚洲桃色在线一区| 成人午夜视频福利| 日本大胆欧美人术艺术动态| 日本欧美肥老太交大片| 精品成人18| 都市激情国产精品| 国产大片在线免费观看| 蜜桃av乱码一区二区三区| 国产欧美精品aaaaaa片| 国产伦精品一区二区三区| 欧美亚洲另类在线| 中文字幕亚洲欧美一区二区三区 | 国产视频99| 97超级碰碰人国产在线观看| 国产亚洲aⅴaaaaaa毛片| 欧美四级电影网| 亚洲情趣在线观看| 久久综合九色综合97婷婷女人 | 亚洲一区二区精品| 91麻豆精品国产91久久久资源速度 | 圆产精品久久久久久久久久久| 久久久久久久久久久久国产精品| 看av免费毛片手机播放| 亚洲精品无人区| 国产富婆一区二区三区| 欧美亚洲激情视频| 欧美韩国理论所午夜片917电影| 亚洲经典中文字幕| 日韩一区二区三区在线视频| 欧美日韩国产激情| 亚洲一区二区四区蜜桃| 国产精品久久久久天堂| 99re热视频精品| 成人av在线资源网| 国产精品一区二区黑丝| 日本欧美在线观看| 视频一区欧美精品| 亚洲永久免费| 国产日韩综合| 一本久久综合| 丝袜美腿亚洲综合| 久久婷婷一区| 男女男精品网站| 欧美bbbbb| 美国一区二区三区在线播放 | 美女视频第一区二区三区免费观看网站| 欧美在线免费| 欧美激情 亚洲a∨综合| 国产精品久久久久久麻豆一区软件| 人人网欧美视频| 久久男人av| 性欧美xxxx免费岛国不卡电影| 亚洲91网站| 林ゆな中文字幕一区二区| 老司机在线精品视频| 国产影视一区| 一区二区三区午夜探花| 黄色成人av网站| 亚洲欧美视频一区二区三区| 视频在线观看国产精品| 国产中文字幕精品| 99久久久免费精品国产一区二区| 99久久精品免费观看| 久久精品夜色噜噜亚洲a∨| 亚洲国产精品国自产拍av| 国产精品视频一二三| 伊人夜夜躁av伊人久久| 精品久久久久久亚洲国产300| 色噜噜夜夜夜综合网| 91精品国模一区二区三区| 日韩欧美国产一二三区| 亚洲人成电影在线| 欧美人与性动交a欧美精品| 午夜精品久久久久久久99热浪潮| 69久久夜色精品国产69| 成人国产精品一区二区| 国产中文一区二区| 韩国黄色一级大片| 无码人妻丰满熟妇区毛片| 日本成人xxx| 黑人巨大精品欧美| 久久国产一级片| 一本色道久久综合无码人妻| 天堂在线视频免费| 国产毛片av| 爱爱永久免费视频| 噜噜噜在线观看播放视频| 中文字幕有码在线观看| 成人午夜sm精品久久久久久久| 福利片一区二区| 国产精品88久久久久久| 免费亚洲视频| 99re这里都是精品| 偷窥少妇高潮呻吟av久久免费 | 精品一区电影国产| 久久精品国产清自在天天线| 国产97人人超碰caoprom| 懂色一区二区三区av片| 91成人在线视频观看| 999这里有精品| 9.1片黄在线观看| 国产精品尤物视频| 欧美一级淫片a免费视频| eeuss影院在线| 久久久久久女乱国产| 狼人综合视频| 蜜臀av免费一区二区三区| av不卡在线| 91免费看片在线观看| 五月综合激情日本mⅴ| 精品久久久三级丝袜| 久久久久久午夜| 久久亚裔精品欧美| 久久精品视频91| 五月天免费网站| 高清在线成人网| 精品一区二区三区免费爱| 影音先锋5566资源网| 91大神影片| 日本高清中文字幕在线| 成人在线高清| 久久亚洲专区| 寂寞少妇一区二区三区| 国产精品电影一区二区| 日韩一区二区免费电影| 91精品国产亚洲| 欧美久久在线| 色播五月激情五月| www.xxxx日本| 最近中文字幕第一页| 性欧美精品男男| 一二三区免费视频| 久久99国产精品久久99小说| 视频一区二区三区在线看免费看| 这里有精品可以观看| 久久综合影院| 国产乱人伦精品一区二区在线观看| 一区二区三区成人在线视频| 亚洲第一偷拍网| 国产精品免费一区豆花| 成人在线播放网址| 五月天婷婷丁香网| 色哟哟中文字幕| 巨胸喷奶水www久久久免费动漫| 在线免费看av的网站| 欧美成人高清手机在线视频| 国产精美视频| 高清av不卡| 欧美福利影院| 欧美国产乱子伦| 精品对白一区国产伦| 国产原创欧美精品| 少妇人妻互换不带套| 国产午夜精品无码| 又爽又黄的午夜网站| а√天堂在线官网| 日韩久久综合| 久久综合五月天婷婷伊人| 欧美专区福利免费| 全球av集中精品导航福利| 久久99久国产精品黄毛片色诱| 天天综合日日夜夜精品| 久久成人综合视频| 国产高清精品软男同| www.日本高清视频| sihu影院永久在线影院| 中文字幕在线免费| 日韩一区二区在线| 国产精品色在线| 日韩中文字幕免费| 91视频成人免费| 九九视频免费看| 8mav在线| 永久免费精品视频| 久久新电视剧免费观看| 亚洲天堂视频在线观看| 亚洲精品久久区二区三区蜜桃臀| 激情高潮到大叫狂喷水| 国产精品一区牛牛影视| 一个人看的www视频在线免费观看| 亚洲综合激情| 欧美日韩高清影院| av免费观看久久| 一级黄色片大全| 欧美日韩亚洲第一页| 国产精品xx| 久草精品在线观看| 日韩精品视频在线观看免费| 亚洲欧洲精品在线| 国产精选第一页| 一级特黄视频| 日韩电影一区| 欧美日韩国产在线播放| 国产精品亚发布| 国精品无码人妻一区二区三区| 精品卡一卡卡2卡3网站| 欧美成人app| 不卡av在线免费观看| 色婷婷综合久久久久| 人妻少妇精品无码专区二区| 无码久久精品国产亚洲av影片| 成年人视频免费| 一级视频在线观看视频在线啦啦| 日韩精品不卡一区二区| 天天影视网天天综合色在线播放| 91精品在线一区| 国产午夜福利一区| 免费全黄无遮挡裸体毛片| 精品影片在线观看的网站| 亚洲一区二区三区中文字幕在线| 国产精品69久久| 国产色视频一区二区三区qq号| 九色蝌蚪在线观看| 欧美影院天天5g天天爽| 亚洲国产精品久久不卡毛片| 成人两性免费视频| 999福利视频| 白白色视频在线| 亚洲麻豆av| 日韩精品www| 国产二区视频在线播放| 亚洲色图21p| 亚洲国产aⅴ精品一区二区三区| 国产欧美日韩视频一区二区| 日韩av电影院| 九九九视频在线观看| 日本视频二区| 国产亚洲在线| 精品视频一区在线视频| 国产亚洲欧美在线视频| 综合免费一区二区三区| 成人在线分类| 亚洲国产中文字幕| 免费看成人午夜电影| 最近中文字幕在线免费观看| 黄色小说在线播放| 91女人视频在线观看| 青青久久av北条麻妃海外网| 手机毛片在线观看| 中文字幕国产在线| 人人精品人人爱| 欧美成人激情在线| 亚洲精品女人久久久| 天天看天天干| 亚洲免费观看| 久久色在线播放| 无码人妻精品一区二区三应用大全 | 国产精品天干天干在观线| 96pao国产成视频永久免费| 久久久国产成人| 国产一二区在线观看| 99久久婷婷国产精品综合| 国产欧美日韩最新| 精品成人久久久| 51av在线| 亚洲精选视频免费看| 欧美在线3区| 无码国精品一区二区免费蜜桃| 精品中国亚洲| 欧美精三区欧美精三区| 国产主播在线看| 狠狠干夜夜爽| 亚洲一区欧美二区| 欧美精品videofree1080p| 91麻豆精品国产91久久综合| 97电影在线观看| 国产亚洲短视频| 欧美大香线蕉线伊人久久国产精品 | 独立日3在线观看完整版| 国产模特精品视频久久久久| 成年人精品视频| 亚洲色图27p| 在线免费av导航| 亚洲美女少妇撒尿| japanese在线播放| 九色资源网91| 91精产国品一二三| 超清福利视频| 国产在线精品不卡| 亚洲综合最新在线| 国产手机精品视频| 私拍精品福利视频在线一区| 精品国产一区二区亚洲人成毛片 | 国产一卡2卡3卡免费网站| 99精品一区| 久久亚洲国产成人| 久久精品国产亚洲av高清色欲 | 久久久午夜精品理论片中文字幕| 粉嫩av免费一区二区三区| 午夜精品久久久久久久爽| 最新精品国偷自产在线| 亚洲午夜未满十八勿入免费观看全集| 中文字幕在线播放视频| 求av网址在线观看| 亚洲国产欧美日韩另类综合 | 欧美亚洲三区| 国产精品女视频| av资源免费看| 黄色一级影院| 不卡区在线中文字幕| 久久精品成人一区二区三区蜜臀| 四虎免费在线观看| 欧美激情在线| 国产精品海角社区在线观看| 亚洲视屏在线观看| 蜜乳av综合| 久久综合伊人77777| 日韩伦人妻无码| 中文字幕一区二区三区中文字幕 | 国产一区二区视频免费在线观看| 国产主播福利| 久久久午夜精品理论片中文字幕| 可以免费看的黄色网址| 天天骑夜夜操| 久久午夜羞羞影院免费观看| 穿情趣内衣被c到高潮视频| 天天操 夜夜操| 久久久久久久久蜜桃| 成人免费网站入口| 中文字幕免费在线| 亚洲综合999| 国产人妻精品午夜福利免费| 婷婷在线播放| 欧美一二三四在线| 99自拍视频在线| 99久久婷婷国产综合精品青牛牛| 中文字幕日韩精品在线观看| 亚洲欧美另类在线视频| 成人精品电影| 国产乱肥老妇国产一区二| 桃花网日韩影视在线观看视频| 日韩黄色在线观看| 色女人综合av| 伦理电影国产精品| 一区二区三区在线视频播放| 热久久久久久久久| 波多野在线观看| 亚洲精品美女免费| 欧美日韩综合在线观看| 国产成人影院| 成人国产精品一区| 午夜娱乐在线| 国产精品美女久久久久久久网站| 一本久道中文无码字幕av| 伊人影院在线视频| 日韩一区二区三区视频在线 | 五月婷婷狠狠操| 91网在线看| 亚洲精品国产精品久久清纯直播| 日韩xxx高潮hd| 欧美+亚洲+精品+三区| 激情一区二区三区| 全部a∨一极品视觉盛宴| 亚洲一级二级在线| 亚洲成人网在线播放| 日韩精品免费视频一区二区三区| 欧美精品videos另类日本| 欧区一欧区二欧区三| 国产一区二区毛片| 青青草原成人网| 免费在线中文字幕| 亚洲四色影视在线观看| 国产免费不卡视频| 久久国产精品区| 干日本少妇首页| 密臀av在线播放| 欧美成人合集magnet| 久久天堂夜夜一本婷婷麻豆| 白白色 亚洲乱淫| 国产一区二区在线观看免费视频| 国产亚洲人成a在线v网站 | 最新日本中文字幕| 精品国产亚洲一区二区三区| 日本精品视频网站| 免费污污网站| 亚洲一二三级电影| 亚洲伦理一区二区三区| 久久社区一区| 视频在线精品一区| 欧洲不卡av| 久久激情视频免费观看| ㊣最新国产の精品bt7086|