一江春水向東流

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

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

          共享內(nèi)存原型
          shmid_ds結(jié)構(gòu)
          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);

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

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

          程序運(yùn)行后,分為父子進(jìn)程,子進(jìn)程申請共享內(nèi)存,然后等待父進(jìn)程繼續(xù)執(zhí)行,父進(jìn)程首先等待子進(jìn)程申請到共享內(nèi)存標(biāo)識,然后輸出共享內(nèi)存中的內(nèi)容,為了演示共享內(nèi)存可以隨時更新,程序中在子進(jìn)程里產(chǎn)生隨機(jī)數(shù)寫入共享內(nèi)存供父進(jìn)程讀取。
          代碼如下:

          #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)?//子進(jìn)程
          ?{??
          ??shmKey = ftok("share",16);??//可以使用任何大于0的數(shù)字,如果名字和數(shù)相同,則產(chǎn)生的key相同。
          ??if(shmKey == -1)
          ??{
          ???printf("創(chuàng)建key出錯\n");
          ???exit(-1);
          ??}
          ??
          ??shmID = shmget(shmKey,20,IPC_CREAT | IPC_EXCL | 0666);
          ??if(shmID == -1)
          ??{
          ???printf("創(chuàng)建共享標(biāo)識出錯\n");
          ???exit(-1);
          ??}
          ??
          ??sleep(2);?//等待父進(jìn)程執(zhí)行,好顯示第一行為空。
          ??while(1)
          ??{
          ???buf = (char *)shmat(shmID,NULL,0);
          ???srandom(time(NULL));
          ???sprintf(buf,"%d",random());?
          ???shmdt(buf);??
          ??}
          ?}
          ?else??//父進(jìn)程
          ?{
          ??sleep(1);?//讓子進(jìn)程先執(zhí)行,以建立內(nèi)存映射。
          ??
          ??shmKey = ftok("share",16);??//可以使用任何大于0的數(shù)字,如果名字和數(shù)相同,則產(chǎn)生的key相同。
          ??if(shmKey == -1)
          ??{
          ???printf("創(chuàng)建key出錯\n");
          ???exit(-1);
          ??}
          ??
          ??shmID = shmget(shmKey,20,0);?//0表示如果shmKey映射的不存在則報錯。
          ??if(shmID == -1)
          ??{
          ???printf("引用共享標(biāo)識出錯\n");
          ???exit(-1);
          ??}
          ??
          ??while(1)
          ??{?
          ???buf = (char *)shmat(shmID,NULL,0);
          ???printf("%d. 現(xiàn)在共享內(nèi)存中的內(nèi)容為:%s\n",i++,buf);
          ???shmdt(buf);
          ???sleep(1);
          ??}
          ?}?

          ?return 0;
          }


          ?

          posted on 2008-04-04 23:55 allic 閱讀(1511) 評論(0)  編輯  收藏 所屬分類: linux/UNIX 應(yīng)用開發(fā)
          主站蜘蛛池模板: 孝义市| 河西区| 缙云县| 慈利县| 武定县| 前郭尔| 文安县| 富平县| 织金县| 杭州市| 马山县| 苍山县| 北流市| 阳朔县| 阳山县| 吉隆县| 大连市| 津南区| 赫章县| 济源市| 蕉岭县| 仪陇县| 兴仁县| 大田县| 富平县| 肥西县| 黔西县| 东城区| 双桥区| 汪清县| 西丰县| 万宁市| 永德县| 类乌齐县| 丹凤县| 永兴县| 栖霞市| 宜昌市| 丰城市| 万安县| 湾仔区|