shmat
作用:共用記憶體區對象映射到調用進程的地址空間
核心處理函數: void *shmat( int shmid , char *shmaddr , int shmflag );shmat()是用來允許本進程訪問一塊共用記憶體的函數。
int shmid是那塊共用記憶體的ID。
char *shmaddr是共用記憶體的起始地址
int shmflag是本進程對該記憶體的操作模式。如果是SHM_RDONLY的話,就是唯讀模式。其它的是讀寫入模式
成功時,這個函數返回共用記憶體的起始地址。失敗時返回-1
最近用到記憶體共用,收集整理了些資料,做了個簡單的對比
| |
mmap系統調用 |
系統V共用記憶體 |
| 擷取共用 記憶體ID |
#include <sys/mman.h> fd=open(name ,flag,mode); if(fd<0) …. |
#include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, size_t size, int shmflg); |
| 映射記憶體 |
ptr=mmap(NULL,len, PROT_READ|PROT_WRITE, MAP_SHARED , fd , 0); |
void *shmat( int shmid , char *shmaddr , int shmflag ); |
| 解除映射 |
int munmap( void * addr, size_t len ) ; |
int shmdt( char *shmaddr ); 使進程中的映射記憶體無效化,不可以使用。但是保留空間 |
| 其它 |
同步: int msync ( void * addr , size_t len, int flags); |
控制: shmctl( shmid , IPC_STAT , &buf ); // 取得共用記憶體的狀態 shmctl( shmid , IPC_RMID , &buf ); // 刪除共用記憶體–刪除共用記憶體,徹底不可用,釋放空間 |