1、共享內存概念
共享內存是三個ipC(Inter-PRocess Communication)機制中的一個。它允許兩個不相關的進程訪問同一個邏輯內存。共享內存是在兩個正在進行的進程之間傳遞數據的一種非常有效的方式。大多數的共享內存的實現,都把由不同進程之間共享的內存安排為同一段物理內存。共享內存是在兩個正在運行的進程之間共享和傳遞數據的一種非常有效的方式。不同進程之間共享的內存通常安排為同一段物理內存。進程可以將同一段共享內存連接到它們自己的地址空間中,所有進程都可以訪問共享內存中的地址,就好像它們是由用C語言函數malloc分配的內存一樣。而如果某個進程向共享內存寫入數據,所做的改動將立即影響到可以訪問同一段共享內存的任何其他進程。 2、共享內存使用函數
這個可以用,但最好不要用: 對于用戶的讀取和寫入許可指定SHM_R和SHM_W; (SHM_R>3)和(SHM_W>3)是一組讀取和寫入許可,而(SHM_R>6)和(SHM_W>6)是全局讀取和寫入許可。
推薦使用這個: 可以使用0666|IPC_CREAT,來作為shmflg的值。
成功返回共享內存的標識符;不成功返回-1,errno儲存錯誤原因。 EINVAL 參數size小于SHMMIN或大于SHMMAX。 EEXIST 預建立key所致的共享內存,但已經存在。 EIDRM 參數key所致的共享內存已經刪除。 ENOSPC 超過了系統允許建立的共享內存的最大值(SHMALL )。 ENOENT 參數key所指的共享內存不存在,參數shmflg也未設IPC_CREAT位。 EACCES 沒有權限。 ENOMEM 核心內存不足。
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,表示連接到由內核選擇的第一個可用地址上,否則,如果flag沒有指定SHM_RND,則連接到addr所指定的地址上,如果flag為SHM_RND,則地址取整 flag:如前所述,一般為0 //推薦值 返回值:如果成功,返回共享存儲段地址,出錯返回-1
shmdt int shmdt(void *addr); addr:共享存儲段的地址,以前調用shmat時的返回值 shmdt將使相關shmid_ds結構中的shm_nattch計數器值減1
shmctl int shmctl(int shmid,int cmd,struct shmid_ds *buf) shmid:共享存儲段的id cmd:一些命令,有:IPC_STAT,IPC_RMID,SHM_LOCK,SHM_UNLOCK 請注意,共享內存不會隨著程序結束而自動消除,要么調用shmctl刪除,要么自己用手敲命令去刪除,否則永遠留在系統中。
新聞熱點
疑難解答