<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    一江春水向東流

    做一個有思想的人,期待與每一位熱愛思考的人交流,您的關注是對我最大的支持。

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      44 隨筆 :: 139 文章 :: 81 評論 :: 0 Trackbacks

    共享內存原型
    shmid_ds結構
    struct shmid_ds{
    ??? struct ipc_perm??? shm_perm;
    ??? size_t?????????????????? shm_segsz;
    ??? pid_t??????????????????? shm_lpid;
    ??? pid_t????????????????????shm_cpid;
    ??? shmatt_t???????????????shm_nattch;
    ??? time_t???????????????????shm_atime;
    ??? time_t?????????????????? shm_dtime;
    ????time_t?????????????????? shm_ctime;
    ??? .
    };

    #include <sys/shm.h>
    int shmget (key_t? key, size_t size, int flag);
    ???? 成功返回共享存儲ID,錯誤返回-1
    int shmctl (int shmid, int cmd, struct shmid_ds,*buf);
    ???? cmd有 IPC_STAT, IPC_SET, IPC_RMID, SHM_LOCK, SHM_UNLOCK

    連接到地址空間
    void *shmat (int shmid ,const void *addr, int flag);

    對共享內存操作結束時,脫離該段
    int shmdt (void *addr);

    要運行程序,需要在當前目錄下建立一個share文件,share是一個空文件,沒有任何意義,只是函數ftok需要一個文件名作參數,ftok另一個參數可以為任何數字。

    程序運行后,分為父子進程,子進程申請共享內存,然后等待父進程繼續執行,父進程首先等待子進程申請到共享內存標識,然后輸出共享內存中的內容,為了演示共享內存可以隨時更新,程序中在子進程里產生隨機數寫入共享內存供父進程讀取。
    代碼如下:

    #include<stdio.h>
    #include<unistd.h>
    #include<stdlib.h>
    #include<string.h>

    #include<time.h>
    #include<signal.h>
    #include<sys/ipc.h>
    #include<sys/shm.h>
    #include<sys/types.h>

    int shmID;
    char * buf;
    ?
    void finalize(int signo)
    {
    ?shmctl(shmID,IPC_RMID,NULL);
    ?
    ?exit(0);
    }

    int main()
    {
    ?int i = 1;??
    ?key_t shmKey;
    ?
    ?signal(SIGINT,finalize);
    ?signal(SIGTERM,finalize);
    ?
    ?if(fork() == 0)?//子進程
    ?{??
    ??shmKey = ftok("share",16);??//可以使用任何大于0的數字,如果名字和數相同,則產生的key相同。
    ??if(shmKey == -1)
    ??{
    ???printf("創建key出錯\n");
    ???exit(-1);
    ??}
    ??
    ??shmID = shmget(shmKey,20,IPC_CREAT | IPC_EXCL | 0666);
    ??if(shmID == -1)
    ??{
    ???printf("創建共享標識出錯\n");
    ???exit(-1);
    ??}
    ??
    ??sleep(2);?//等待父進程執行,好顯示第一行為空。
    ??while(1)
    ??{
    ???buf = (char *)shmat(shmID,NULL,0);
    ???srandom(time(NULL));
    ???sprintf(buf,"%d",random());?
    ???shmdt(buf);??
    ??}
    ?}
    ?else??//父進程
    ?{
    ??sleep(1);?//讓子進程先執行,以建立內存映射。
    ??
    ??shmKey = ftok("share",16);??//可以使用任何大于0的數字,如果名字和數相同,則產生的key相同。
    ??if(shmKey == -1)
    ??{
    ???printf("創建key出錯\n");
    ???exit(-1);
    ??}
    ??
    ??shmID = shmget(shmKey,20,0);?//0表示如果shmKey映射的不存在則報錯。
    ??if(shmID == -1)
    ??{
    ???printf("引用共享標識出錯\n");
    ???exit(-1);
    ??}
    ??
    ??while(1)
    ??{?
    ???buf = (char *)shmat(shmID,NULL,0);
    ???printf("%d. 現在共享內存中的內容為:%s\n",i++,buf);
    ???shmdt(buf);
    ???sleep(1);
    ??}
    ?}?

    ?return 0;
    }


    ?

    posted on 2008-04-04 23:55 allic 閱讀(1507) 評論(0)  編輯  收藏 所屬分類: linux/UNIX 應用開發
    主站蜘蛛池模板: 国产成人免费一区二区三区| 亚洲精品中文字幕乱码三区| www永久免费视频| 亚洲AV无码精品色午夜果冻不卡| 91久久精品国产免费一区| 国产亚洲精品AAAA片APP| 亚洲精品少妇30p| 成人午夜大片免费7777| 一区在线免费观看| 亚洲无砖砖区免费| 亚洲福利精品一区二区三区| 最近中文字幕mv免费高清在线| 免费亚洲视频在线观看| 亚洲国产成人私人影院| 少妇亚洲免费精品| 国内精品免费麻豆网站91麻豆| 污视频网站在线免费看| 亚洲人6666成人观看| 在线亚洲人成电影网站色www| 四虎影院免费在线播放| 免费A级毛片无码专区| 精品一区二区三区无码免费直播 | 国产亚洲自拍一区| 在线视频免费观看高清| 中国好声音第二季免费播放| 亚洲日本中文字幕天天更新| 亚洲国产成人私人影院| 亚洲欧洲日本在线| 日韩免费高清视频网站| 亚州免费一级毛片| 国产日韩AV免费无码一区二区| 日韩亚洲人成网站| 亚洲一卡2卡三卡4卡无卡下载| 亚洲成熟xxxxx电影| 国产亚洲美日韩AV中文字幕无码成人| 免费中文熟妇在线影片 | 嫩草在线视频www免费观看| 国产成人亚洲综合a∨| 亚洲国产成人久久| 久久精品国产亚洲77777| 亚洲精品成人网站在线观看|