IT培训机构|91免费精品视频|专注编程培训|91免费精品|软件开发培训_91免费国产视频_华清远见教育


linux共享內存實驗

分享到:
           

    本文關鍵字: 內存共享

    1.實驗目的

    通過編寫共享內存實驗,進一步了解使用共享內存的具體步驟,同時加深對共享內存的理解。在本實驗中,采用信號量作為同步機制完善兩個進程(“生產者”和“消費者”)之間的通信,其功能類似于4.6節中的實例。在實例中使用信號量同步機制。

    2.實驗內容

    該實現要求利用共享內存實現文件的打開和讀寫操作。

    3.實驗步驟

    (1)畫出流程圖。該實驗流程圖如圖1所示。


圖1 實驗流程圖

    (2)編寫代碼。下面是共享內存緩沖區的數據結構的定義:

    /* shm_com.h */
    #include <unistd.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/shm.h>
    #define SHM_BUFF_SZ 2048
    struct shm_buff
    {
        int pid;
        char buffer[SHM_BUFF_SZ];
    };

    以下是“生產者”程序部分:

    /* sem_com.h 和 sem_com.c 與4.4節示例中的同名程序相同 */
    /* producer.c */
    #include "shm_com.h"
    #include "sem_com.h"
    #include <signal.h>
    int ignore_signal(void)
    { /* 忽略一些信號,以免非法退出程序 */
        signal(SIGINT, SIG_IGN);
        signal(SIGSTOP, SIG_IGN);
        signal(SIGQUIT, SIG_IGN);
        return 0;
    }

    int main()
    {
        void *shared_memory = NULL;
        struct shm_buff *shm_buff_inst;
        char buffer[BUFSIZ];
        int shmid, semid;
        /* 定義信號量,用于實現訪問共享內存的進程間的互斥 */
        ignore_signal(); /* 防止程序非正常退出 */
        semid = semget(ftok(".", 'a'), 1, 0666|IPC_CREAT); /* 創建一個信號量 */
        init_sem(semid);/* 初始值為1 */

        /* 創建共享內存 */
        shmid = shmget(ftok(".", 'b'), sizeof(struct shm_buff), 0666|IPC_CREAT);
        if (shmid == -1)
        {
            perror("shmget failed");
            del_sem(semid);
            exit(1);
        }

        /* 將共享內存地址映射到當前進程地址空間 */
        shared_memory = shmat(shmid, (void*)0, 0);
        if (shared_memory == (void*)-1)
        {
            perror("shmat");
            del_sem(semid);
            exit(1);
        }
        printf("Memory attached at %X\n", (int)shared_memory);
        /* 獲得共享內存的映射地址 */
        shm_buff_inst = (struct shared_use_st *)shared_memory;
        do
        {
            sem_p(semid);
            printf("Enter some text to the shared memory(enter 'quit' to exit):");
            /* 向共享內存寫入數據 */
            if (fgets(shm_buff_inst->buffer, SHM_BUFF_SZ, stdin) == NULL)
            {
                perror("fgets");
                sem_v(semid);
                break;
            }
            shm_buff_inst->pid = getpid();
            sem_v(semid);
        } while(strncmp(shm_buff_inst->buffer, "quit", 4) != 0);

        /* 刪除信號量 */
        del_sem(semid);
        /* 刪除共享內存到當前進程地址空間中的映射 */
        if (shmdt(shared_memory) == 1)
        {
            perror("shmdt");
            exit(1);
        }
        exit(0);
    }

    以下是“消費者”程序部分:

    /* customer.c */
    #include "shm_com.h"
    #include "sem_com.h"

    int main()
    {
        void *shared_memory = NULL;
        struct shm_buff *shm_buff_inst;
        int shmid, semid;
        /* 獲得信號量 */
        semid = semget(ftok(".", 'a'), 1, 0666);
        if (semid == -1)
        {
            perror("Producer is'nt exist");
            exit(1);
        }
        /* 獲得共享內存 */
        shmid = shmget(ftok(".", 'b'), sizeof(struct shm_buff), 0666|IPC_CREAT);
        if (shmid == -1)
        {
            perror("shmget");
            exit(1);
        }
        /* 將共享內存地址映射到當前進程地址空間 */
        shared_memory = shmat(shmid, (void*)0, 0);
        if (shared_memory == (void*)-1)
        {
            perror("shmat");
            exit(1);
        }
        printf("Memory attached at %X\n", (int)shared_memory);
        /* 獲得共享內存的映射地址 */
        shm_buff_inst = (struct shm_buff *)shared_memory;
        do
        {
            sem_p(semid); printf("Shared memory was written by process %d :%s",
            shm_buff_inst->pid, shm_buff_inst->buffer);
            if (strncmp(shm_buff_inst->buffer, "quit", 4) == 0)
            {
                break;
            }
            shm_buff_inst->pid = 0;
            memset(shm_buff_inst->buffer, 0, SHM_BUFF_SZ);
            sem_v(semid);
        } while(1);

        /* 刪除共享內存到當前進程地址空間中的映射 */
        if (shmdt(shared_memory) == -1)
        {
            perror("shmdt");
            exit(1);
        }
        /* 刪除共享內存 */
        if (shmctl(shmid, IPC_RMID, NULL) == -1)
        {
            perror("shmctl(IPC_RMID)");
            exit(1);
        }
        exit(0);
    }

    4.實驗結果

    實驗運行結果如下:

    $./producer
    Memory attached at B7F90000
    Enter some text to the shared memory(enter 'quit' to exit):First message
    Enter some text to the shared memory(enter 'quit' to exit):Second message
    Enter some text to the shared memory(enter 'quit' to exit):quit
    $./customer
    Memory attached at B7FAF000
    Shared memory was written by process 3815 :First message
    Shared memory was written by process 3815 :Second message
    Shared memory was written by process 3815 :quit

    本文選自華清遠見嵌入式培訓教材《從實踐中學嵌入式Linux應用程序開發》

   熱點鏈接:

   1、linux 共享內存
   2、linux有名管道通信實驗
   3、linux 消息隊列
   4、linux下的信號量
   5、linux下的信號處理實例

更多新聞>> 

主站蜘蛛池模板: 易交换在线易货电商平台-互联网易物贸易,以物换物-无锡据风网络科技有限公司 | 汽车漆品牌|家具漆代理|涂料加盟厂家|家具漆|汽车漆-邦派漆官网 汽车漆|汽车油漆|工业油漆涂料|汽车漆加盟-佛山市科涂涂料有限公司 | 郑州编织袋_河南编织袋厂-郑州升达编织袋厂 | 深圳喜运达物流官网_东南亚物流|海运|专线|海外仓_泰国菲律宾马来西亚海运|物流专线|海外仓 | 南宁清洁公司|外墙清洗|开荒清洁|洒水车|管道疏通|园林绿化_广西优而美环境工程有限公司 | 著名刑事诉讼律师_刑事辩护律师★王平聚【清华博士/刑法教授】 | 首页|广东蒙泰高新纤维股份有限公司|丙纶细旦丝|丙纶异形丝|丙纶FDY网络丝 - 广东蒙泰高新纤维股份有限公司 | 网带烘干机-不锈钢网带-乙型网带-不锈钢链板-网带输送机-宁津县天惠机械制造有限公司 | 制砂机-合金-耐磨锤头-耐磨衬板-铸造件厂家-巩义市豫园宏宇铸造有限公司 | 石家庄德迈机电设备有限公司 | 首页-西安汉沣精密机械有限公司 首页-上海钢之杰智能建筑集团股份有限公司 | 润滑油展会 沈阳 南京 润滑油 展会 西安 润滑脂 中国国际润滑油 全国润滑油 汽配_中国国际润滑油、脂、养护用品及技术设备展览会 | 内衬不锈钢复合管,大口径内衬不锈钢复合钢管,双金属复合管,内衬不锈钢复合管厂家-江苏新澎 | 葫芦岛市鹏翔农药化工科技有限公司-苦参碱可溶液剂-氯氰菊酯乳油-阿维菌素乳油 | 全国重点实验室--人民网| 吉林市康艺商贸有限公司_吉林市康艺商贸有限公司 | 树枝粉碎机,锯末机,木材粉碎机的专业生产厂家利鑫机械,问价格找利鑫 | 欧氏运动木地板,体育木地板厂家,篮球木地板价格_欧氏体育木地板 欧派板材官网 | 全屋定制板材 专业供应商 | 永康风水大师选风水先生老徐 - 徐根法| 煤泥烘干机,酒糟烘干机,药渣烘干机,酵母烘干机,烘干机厂家-瑞奥新能源 | 远程供电系统-电源发生器-隔离电源转换器-深圳市安博特电源设备有限公司 | 喜来顺财经-专注于财经领域的综合性网站| 气瓶探伤设备-气瓶在线离线无损探伤检测系统-中高低压力容器超声波自动探伤设备-山科飞泰 | 聚达|聚达物联|聚达物联科技|杭州聚达物联科技有限公司|www.judawulian.com|智慧社区|数字驾驶舱|智慧清运|智慧工地|邻家小达 | 真空干燥箱厂家-热风循环烘箱生产厂家-鼓风烘干箱价格-南京火燥机械科技有限公司 | 无锡双海金属科技有限公司[官网]| 山东飞斯特汽车科技有限公司 | 两面针(江苏)实业有限公司-原两面针(扬州)酒店用品有限公司 | 压滤机专用泵|柱塞泥浆泵|咸阳华星泵业有限公司 | 济宁山银煤矿机械有限公司,钻采工具,防爆电器,凿岩机械,风动工具,矿山机械,建筑机械,支护设备,通风防尘,铁路设备,仪器仪表,大型设备,矿用泵,钎具类,消防类,矿车类,配件区类 | 河北撒旺肥业有限公司 | 太原塑料托盘,塑料筐,塑料箱,塑料垃圾桶_太原都程塑料制品有限公司 | 深圳市桃子自动化科技有限公司-点胶机_灌胶机_焊锡机_螺丝机_SCARA机器人 | 威海牙科,威海种植牙,威海人工种植牙-威海经济开发区姚晓艺口腔诊所 | 真空烘箱-高低温试验箱-防爆烘箱-防爆高低温试验箱-老化房-恒温恒湿箱-高低温试验箱-高低温冲击试验箱厂家—上海标承实验仪器有限公司 | 麦秸映像网络技术有限公司,河南省政府采网入驻对接,新乡网站维护建设,小程序开发,APP定制开发,钉钉开发,新乡软件开发等相关网络业务 | 豪美陶瓷|陶瓷十大品牌|佛山陶瓷放心消费品牌 | 山东货架,山东仓库货架,临沂仓库货架,临沂仓储货架-山东兴博物流设备有限公司 | 芯片_IC_半导体品牌一级代理商-深圳市合通泰电子有限公司 | 威学一百-专注国际学校择校备考-DSE-A-level-雅思-托福-OSSD-港澳台联考-AP-IGCSE-IB-AMC-多邻国-PTE-SAT-SSAT-小语种(如日语,韩语,德语,法语,西班牙语,意大利语,俄语,泰语)等考试培训,为出国留学学生提供个性化定制性学习方案,线下实体面授+线上网络课程, 提供一对一,小班课等多种班型 | 上海物流公司_上海冷链运输_空运_电商仓储配送电话-迈泽物流 |