1、共享內(nèi)存概念
共享內(nèi)存是三個ipC(Inter-PRocess Communication)機制中的一個。它允許兩個不相關(guān)的進程訪問同一個邏輯內(nèi)存。共享內(nèi)存是在兩個正在進行的進程之間傳遞數(shù)據(jù)的一種非常有效的方式。大多數(shù)的共享內(nèi)存的實現(xiàn),都把由不同進程之間共享的內(nèi)存安排為同一段物理內(nèi)存。共享內(nèi)存是在兩個正在運行的進程之間共享和傳遞數(shù)據(jù)的一種非常有效的方式。不同進程之間共享的內(nèi)存通常安排為同一段物理內(nèi)存。進程可以將同一段共享內(nèi)存連接到它們自己的地址空間中,所有進程都可以訪問共享內(nèi)存中的地址,就好像它們是由用C語言函數(shù)malloc分配的內(nèi)存一樣。而如果某個進程向共享內(nèi)存寫入數(shù)據(jù),所做的改動將立即影響到可以訪問同一段共享內(nèi)存的任何其他進程。 2、共享內(nèi)存使用函數(shù)
這個可以用,但最好不要用: 對于用戶的讀取和寫入許可指定SHM_R和SHM_W; (SHM_R>3)和(SHM_W>3)是一組讀取和寫入許可,而(SHM_R>6)和(SHM_W>6)是全局讀取和寫入許可。
推薦使用這個: 可以使用0666|IPC_CREAT,來作為shmflg的值。
成功返回共享內(nèi)存的標(biāo)識符;不成功返回-1,errno儲存錯誤原因。 EINVAL 參數(shù)size小于SHMMIN或大于SHMMAX。 EEXIST 預(yù)建立key所致的共享內(nèi)存,但已經(jīng)存在。 EIDRM 參數(shù)key所致的共享內(nèi)存已經(jīng)刪除。 ENOSPC 超過了系統(tǒng)允許建立的共享內(nèi)存的最大值(SHMALL )。 ENOENT 參數(shù)key所指的共享內(nèi)存不存在,參數(shù)shmflg也未設(shè)IPC_CREAT位。 EACCES 沒有權(quán)限。 ENOMEM 核心內(nèi)存不足。
include/linux/shm.h struct shmid_ds { struct ipc_perm shm_perm; /* Operation perms */ int shm_segsz; /* size of segment (bytes) */ __kernel_time_t shm_atime; /* last attach time */ __kernel_time_t shm_dtime; /* last detach time */ __kernel_time_t shm_ctime; /* last change time */ __kernel_ipc_pid_t shm_cpid; /* pid of creator */ __kernel_ipc_pid_t shm_lpid; /* pid of last operator */ unsigned short shm_nattch; /* no. of current attaches */ unsigned short shm_unused; /* compatibility */ void shm_unused2; / ditto - used by DIPC */ void shm_unused3; / unused */ };
}; //—————————————-
shmat void *shmat(int shmid, const void *addr, int flag); shmid:共享存儲的id addr:一般為0,表示連接到由內(nèi)核選擇的第一個可用地址上,否則,如果flag沒有指定SHM_RND,則連接到addr所指定的地址上,如果flag為SHM_RND,則地址取整 flag:如前所述,一般為0 //推薦值 返回值:如果成功,返回共享存儲段地址,出錯返回-1
shmdt int shmdt(void *addr); addr:共享存儲段的地址,以前調(diào)用shmat時的返回值 shmdt將使相關(guān)shmid_ds結(jié)構(gòu)中的shm_nattch計數(shù)器值減1
shmctl int shmctl(int shmid,int cmd,struct shmid_ds *buf) shmid:共享存儲段的id cmd:一些命令,有:IPC_STAT,IPC_RMID,SHM_LOCK,SHM_UNLOCK 請注意,共享內(nèi)存不會隨著程序結(jié)束而自動消除,要么調(diào)用shmctl刪除,要么自己用手敲命令去刪除,否則永遠留在系統(tǒng)中。
新聞熱點
疑難解答