IPC--三---共享内存
生活随笔
收集整理的這篇文章主要介紹了
IPC--三---共享内存
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、何謂共享內存?
共享內存可以說是最有用的進程間通信方式,也是最快的IPC形式。兩個不同進程A、B共享內存的意思是,同一塊物理內存被映射到進程A、B各自的進程地址空間。進程A可以即時看到進程B對共享內存中數據的更新,反之亦然。由于多個進程共享同一塊內存區域,必然需要某種同步機制,互斥鎖和信號量都可以。
二:共享內存的使用
1. 創建共享內存(打開)
#include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key,size_t size,int shmflg>;key(非0整數):為共享內存段命名,shmget成功時返回一個與key相關的內存標識符shm_id(非負整數),失敗時返回-1size:以字節為單位指定需要共享的內存容量shmflg:權限標志,與open函數的mode參數一樣,創建共享內存時此參數位可寫成 IPC_CREAT | 0666- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
2.啟動進程對共享內存的訪問(映射)?
第一次創建完共享內存時,它還不能被任何進程訪問,shmat函數的作用就是用來啟動對該共享內存的訪問,并把共享內存連接到當前進程的地址空間。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
shmat 調用成功后返回一個指向共享內存第一個字節的指針,調用失敗返回-1。
3、分離共享內存(解除映射)?
shmdt函數用于將共享內存從當前進程中分離。注意,將共享內存分離并不是刪除它,只是使該共享內存對當前進程不再可用。
- 1
- 2
- 3
- 4
- 5
- 6
調用成功返回0,失敗返回-1。?
4、控制共享內存(控制)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
調用成功返回0,失敗返回-1
三:編寫共享內存代碼
一般對內存區域的操作是先打開-》映射-》(操作)-》(控制)-》解除映射。?
shm.h
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
shm.c
#include "shm.h"int get_shm() {key_t key = ftok(_PATH_,_PROJECT_);int flag = IPC_CREAT | 0666;int shm_id = shmget(key,_SHM_SIZE_,flag);if(shm_id ==-1){printf("shmget error\n");}else{printf("shmget success\n");}return shm_id; } char *at_shm(int shm_id) {return (char*)shmat(shm_id,NULL,0); } int delete_shm(char* addr) {return shmdt(addr); } int rm_shm(int shm_id) {return shmctl(shm_id,IPC_RMID,NULL); }int main() {int shm_id = get_shm();//創建新進程pid_t id= fork();if(id<0){printf("fork error\n");return 1;}else if(id==0){//childchar *buf = at_shm(shm_id);int i = 0;while(i<4096){buf[i]= 'w';i++;}buf[4096]= '\0';delete_shm(buf);}else{//fatherchar *buf = at_shm(shm_id);sleep(3);printf("%s\n",buf);waitpid(id,NULL,0);rm_shm(shm_id);}return 0; }總結
以上是生活随笔為你收集整理的IPC--三---共享内存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用gdb调试多进程和多线程
- 下一篇: Arc协议