一江春水向東流

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

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

          IPC之共享存儲(chǔ)區(qū)
          用共享存儲(chǔ)區(qū)進(jìn)行進(jìn)程間通信主要有以下步驟組成
          1. Create shared memory?
          int shmget(key_t key, int size, int shmflg);?
          if ((shm_id = shmget (mykey, sizeof (struct sharedbuf), 0600 | IFLAGS)) < 0)
          ??? perror ("shmget");

          2. Attach shared memory?
          char *buf = shmat (shm_id, 0, 0);
          ?
          3. Read / Write shared memory?
          sharedbuf->size = size_;?
          memcpy(sharedbuf->buf, mybuf, size_);?
          memcpy(mybuf, sharedbuf->buf, sharedbuf->size);?
          ?
          3. Detach shared memory (optional)?
          shmdt (buf);
          ?
          4. Remove shared memory?
          if (shmctl (shm_id, IPC_RMID, (struct shmid_ds *)0) < 0)?
          ??? perror ("shmctl");

          一個(gè)測(cè)試過的實(shí)例
          #include <stdio.h>
          #include <sys/types.h>
          #include <sys/shm.h>
          #include <sys/ipc.h>
          #define SHM_MODE (SHM_R | SHM_W)
          #define SHM_SIZE 2048

          int main()
          {
          ?int segment_id, segment_size;
          ?char *shared_memory;
          ?pid_t pid;
          ?
          ?if((segment_id = shmget(IPC_PRIVATE, SHM_SIZE, SHM_MODE)) < 0)/*獲得共享內(nèi)存標(biāo)識(shí)符*/
          ??perror("shmget error!\n");
          ?if((shared_memory = shmat(segment_id, 0, 0)) == (void *)-1)/*進(jìn)程和共享內(nèi)存段相連接*/
          ??perror("shmat error!\n");
          ?printf("test1 send a message to share memory.\n");
          ?sprintf(shared_memory, "Hello test2\n");
          ?shmdt(shared_memory);/*脫離鏈接*/
          ?pid = fork();
          ?if(pid < 0)
          ??perror("Creating process error!\n");
          ?else if(pid > 0)
          ?{
          ??wait(NULL); /*父進(jìn)程等待子進(jìn)程結(jié)束*/
          ??shmctl(segment_id, IPC_RMID, 0);/*子進(jìn)程結(jié)束,父進(jìn)程將共享內(nèi)存刪除*/
          ??exit(0);
          ?}
          ?else
          ?{???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
          ??if((shared_memory = shmat(segment_id, 0, 0)) == (void*)-1)/*子進(jìn)程和共享內(nèi)存連接*/
          ???perror("shmat error!\n");
          ??printf("test2 get a message form share memory:%s",shared_memory);
          ??shmdt(shared_memory);
          ?}
          }?????

          相關(guān)參考:http://blog.csdn.net/Apollo_zhc/archive/2006/06/01/768694.aspx

          posted on 2007-05-04 17:27 allic 閱讀(505) 評(píng)論(0)  編輯  收藏 所屬分類: linux/UNIX 應(yīng)用開發(fā)
          主站蜘蛛池模板: 枝江市| 舟曲县| 柏乡县| 合江县| 会同县| 比如县| 定南县| 邳州市| 福泉市| 甘孜| 永兴县| 马公市| 农安县| 文登市| 蓬安县| 盐亭县| 大新县| 东源县| 谢通门县| 牟定县| 兴文县| 青州市| 宣城市| 阜新市| 皋兰县| 冷水江市| 周宁县| 奇台县| 鹤峰县| 新民市| 南木林县| 象山县| 子长县| 大连市| 赤水市| 土默特右旗| 五寨县| 饶河县| 肇庆市| 云龙县| 措美县|