国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

歡迎使用CSDN-markdown編輯器

2019-11-10 18:58:31
字體:
供稿:網(wǎng)友

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ù)

include

key_t key

key標(biāo)識共享內(nèi)存的鍵值: 0/IPC_PRIVATE。 當(dāng)key的取值為IPC_PRIVATE,則函數(shù)shmget()將創(chuàng)建一塊新的共享內(nèi)存;如果key的取值為0,而參數(shù)shmflg中設(shè)置了IPC_PRIVATE這個標(biāo)志,則同樣將創(chuàng)建一塊新的共享內(nèi)存。在IPC的通信模式下,不管是使用消息隊列還是共享內(nèi)存,甚至是信號量,每個IPC的對象(object)都有唯一的名字,稱為“鍵”(key)。通過“鍵”,進程能夠識別所用的對象。“鍵”與IPC對象的關(guān)系就如同文件名稱之于文件,通過文件名,進程能夠讀寫文件內(nèi)的數(shù)據(jù),甚至多個進程能夠共用一個文件。而在IPC的通訊模式下,通過“鍵”的使用也使得一個IPC對象能為多個進程所共用。linux系統(tǒng)中的所有表示System V中IPC對象的數(shù)據(jù)結(jié)構(gòu)都包括一個ipc_perm結(jié)構(gòu),其中包含有IPC對象的鍵值,該鍵用于查找System V中IPC對象的引用標(biāo)識符。如果不使用“鍵”,進程將無法存取IPC對象,因為IPC對象并不存在于進程本身使用的內(nèi)存中。通常,都希望自己的程序能和其他的程序預(yù)先約定一個唯一的鍵值,但實際上并不是總可能的成行的,因為自己的程序無法為一塊共享內(nèi)存選擇一個鍵值。因此,在此把key設(shè)為IPC_PRIVATE,這樣,操作系統(tǒng)將忽略鍵,建立一個新的共享內(nèi)存,指定一個鍵值,然后返回這塊共享內(nèi)存IPC標(biāo)識符ID。而將這個新的共享內(nèi)存的標(biāo)識符ID告訴其他進程可以在建立共享內(nèi)存后通過派生子進程,或?qū)懭胛募蚬艿纴韺崿F(xiàn)。

int size(單位字節(jié)Byte)

size是要建立共享內(nèi)存的長度。所有的內(nèi)存分配操作都是以頁為單位的。所以如果一段進程只申請一塊只有一個字節(jié)的內(nèi)存,內(nèi)存也會分配整整一頁(在i386機器中一頁的缺省大小PACE_SIZE=4096字節(jié))這樣,新創(chuàng)建的共享內(nèi)存的大小實際上是從size這個參數(shù)調(diào)整而來的頁面大小。即如果size為1至4096,則實際申請到的共享內(nèi)存大小為4K(一頁);4097到8192,則實際申請到的共享內(nèi)存大小為8K(兩頁),依此類推。

int shmflg

shmflg主要和一些標(biāo)志有關(guān)。其中有效的包括IPC_CREAT和IPC_EXCL,它們的功能與open()的O_CREAT和O_EXCL相當(dāng)。IPC_CREAT 如果共享內(nèi)存不存在,則創(chuàng)建一個共享內(nèi)存,否則打開操作。IPC_EXCL 只有在共享內(nèi)存不存在的時候,新的共享內(nèi)存才建立,否則就產(chǎn)生錯誤。如果單獨使用IPC_CREAT,shmget()函數(shù)要么返回一個已經(jīng)存在的共享內(nèi)存的操作符,要么返回一個新建的共享內(nèi)存的標(biāo)識符。如果將IPC_CREAT和IPC_EXCL標(biāo)志一起使用,shmget()將返回一個新建的共享內(nèi)存的標(biāo)識符;如果該共享內(nèi)存已存在,或者返回-1。 IPC_EXEL標(biāo)志本身并沒有太大的意義,但是和IPC_CREAT標(biāo)志一起使用可以用來保證所得的對象是新建的,而不是打開已有的對象。

這個可以用,但最好不要用: 對于用戶的讀取和寫入許可指定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)存不足。

struct shmid_ds

shmid_ds數(shù)據(jù)結(jié)構(gòu)表示每個新建的共享內(nèi)存。當(dāng)shmget()創(chuàng)建了一塊新的共享內(nèi)存后,返回一個可以用于引用該共享內(nèi)存的shmid_ds數(shù)據(jù)結(jié)構(gòu)的標(biāo)識符。

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 */ };

struct ipc_perm

對于每個IPC對象,系統(tǒng)共用一個struct ipc_perm的數(shù)據(jù)結(jié)構(gòu)來存放權(quán)限信息,以確定一個ipc操作是否可以訪問該IPC對象。struct ipc_perm { __kernel_key_t key; __kernel_uid_t uid; __kernel_gid_t gid; __kernel_uid_t cuid; __kernel_gid_t cgid; __kernel_mode_t mode; unsigned short seq;

}; //—————————————-

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)中。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 偃师市| 杨浦区| 泸州市| 永定县| 西畴县| 册亨县| 报价| 东城区| 平邑县| 炉霍县| 页游| 兴文县| 清远市| 滕州市| 曲水县| 安丘市| 温州市| 仪陇县| 尤溪县| 信阳市| 突泉县| 阿拉善左旗| 长沙县| 荣昌县| 南陵县| 阿坝| 海丰县| 安义县| 武宁县| 恩施市| 新营市| 喀喇沁旗| 济南市| 阳朔县| 岑溪市| 甘南县| 莎车县| 监利县| 台北县| 广西| 家居|