一江春水向東流

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

            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 閱讀(1516) 評論(0)  編輯  收藏 所屬分類: linux/UNIX 應用開發
          主站蜘蛛池模板: 罗甸县| 安溪县| 益阳市| 汨罗市| 鄱阳县| 洛浦县| 襄樊市| 吴旗县| 庆安县| 清丰县| 昭觉县| 松桃| 尖扎县| 军事| 元氏县| 泽普县| 麻栗坡县| 华阴市| 合川市| 漳平市| 内丘县| 吴忠市| 砚山县| 灌南县| 区。| 桐城市| 嘉义市| 丰顺县| 临汾市| 柘城县| 高台县| 文成县| 江油市| 墨竹工卡县| 珲春市| 信阳市| 梓潼县| 个旧市| 商南县| 霍城县| 海晏县|