freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

unix共享內(nèi)存應(yīng)用中的問(wèn)題及解決方法(編輯修改稿)

2025-07-04 13:37 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 66 | IPC_CREAT | IPC_SHARE32)對(duì)于32位應(yīng)用,沒(méi)有設(shè)定IPC_SHARE32標(biāo)志的要求,但設(shè)置該標(biāo)志并不會(huì)帶來(lái)任何問(wèn)題,也就是說(shuō)無(wú)論應(yīng)用程序?qū)⒈痪幾g為32位還是64位模式,都可采用如上相同的代碼;并且由此解決32位應(yīng)用和64位應(yīng)用在共享內(nèi)存訪問(wèn)上的兼容性問(wèn)題。 對(duì)同一共享內(nèi)存的連接數(shù)限制在HPUX上,應(yīng)用進(jìn)程對(duì)同一個(gè)共享內(nèi)存區(qū)的連接次數(shù)被限制為最多1次;區(qū)別于上面第3節(jié)所介紹的AIX上的連接數(shù)限制,HPUX并未對(duì)指向不同共享內(nèi)存區(qū)的連接數(shù)設(shè)置上限,也就是說(shuō),運(yùn)行在HPUX上的應(yīng)用進(jìn)程可以同時(shí)連接很多個(gè)不同的共享內(nèi)存區(qū),但對(duì)于同一個(gè)共享內(nèi)存區(qū),最多只允許連接1次;否則,shmat調(diào)用將失敗,返回錯(cuò)誤碼EINVAL,在shmat的man幫助中,對(duì)該錯(cuò)誤碼有下列解釋:shmid is not a valid shared memory identifier, (possibly because the shared memory segment was already removed using shmctl(2) with IPC_RMID), or the calling process is already attached to shmid.這個(gè)限制會(huì)對(duì)多線程應(yīng)用帶來(lái)無(wú)法避免的問(wèn)題,只要一個(gè)應(yīng)用進(jìn)程中有超過(guò)1個(gè)以上的線程企圖連接同一個(gè)共享內(nèi)存區(qū),則都將以失敗而告終。 解決這個(gè)問(wèn)題,需要修改應(yīng)用程序設(shè)計(jì),使應(yīng)用進(jìn)程具備對(duì)同一共享內(nèi)存的多線程訪問(wèn)能力。相對(duì)于前述問(wèn)題的解決方法,解決這個(gè)問(wèn)題的方法要復(fù)雜一些。作為可供參考的方法之一,以下介紹的邏輯可以很好地解決這個(gè)問(wèn)題:基本思路是,對(duì)于每一個(gè)共享內(nèi)存區(qū),應(yīng)用進(jìn)程首次連接上之后,將其鍵值(ftok的返回值)、系統(tǒng)標(biāo)識(shí)符(shmid,shmget調(diào)用的返回值)和訪問(wèn)地址(即shmat調(diào)用的返回值)保存下來(lái),以這個(gè)進(jìn)程的全局?jǐn)?shù)組或者鏈表的形式留下記錄。在任何對(duì)共享內(nèi)存的連接操作之前,程序都將先行檢索這個(gè)記錄列表,根據(jù)鍵值和標(biāo)志符去匹配希望訪問(wèn)的共享內(nèi)存,如果找到匹配記錄,則從記錄中直接讀取訪問(wèn)地址,而無(wú)需再次調(diào)用shmat函數(shù),從而解決這一問(wèn)題;如果沒(méi)有找到匹配目標(biāo),則調(diào)用shmat建立連接,并且為新連接上來(lái)的共享內(nèi)存添加一個(gè)新記錄。記錄條目的數(shù)據(jù)結(jié)構(gòu),可定義為如下形式:typedef struct _Shared_Memory_Record{ key_t mem_key。 // key generated by ftok() int mem_id。 // id returned by shmget() void* mem_addr。 // access address returned by shmat() int nattach。 // times of attachment } Shared_Memory_Record。其中,nattach成員的作用是,記錄當(dāng)前對(duì)該共享內(nèi)存區(qū)的連接數(shù)目;每一次打開(kāi)共享內(nèi)存的操作都將對(duì)其進(jìn)行遞增,而每一次關(guān)閉共享內(nèi)存的操作將其遞減,直到nattach的數(shù)值降到0,則對(duì)該共享內(nèi)存區(qū)調(diào)用shmdt進(jìn)行真正的斷開(kāi)連接。打開(kāi)共享內(nèi)存的邏輯流程可參考如下圖一:圖一 關(guān)閉共享內(nèi)存的邏輯流程可參考如下圖二:圖二 回頁(yè)首5. Solaris中的shmdt函數(shù)原型問(wèn)題Solaris系統(tǒng)中的shmdt調(diào)用,在原型上與System V標(biāo)準(zhǔn)有所不同, Default int shmdt(char *shmaddr)。 即形參shmaddr的數(shù)據(jù)類型在Solaris上是char *,而System V定義的是void * 類型;實(shí)際上Solaris上shmdt調(diào)用遵循的函數(shù)原型規(guī)范是SVIDv4之前的標(biāo)準(zhǔn);以Linux系統(tǒng)為例,libc4和libc5 采用的是char * 類型的形參,而遵循SVIDv4及后續(xù)標(biāo)準(zhǔn)的glibc2及其更新版本,均改為采用void * 類型的形參。如果仍在代碼中采用System V的標(biāo)準(zhǔn)原型,就會(huì)在Solaris上編譯代碼時(shí)造成編譯錯(cuò)誤;比如:Error: Formal argument 1 of type char* in call to shmdt(char*) is being passed void*.解決方法是,引入一個(gè)條件編譯宏,在編譯平臺(tái)是Solaris時(shí),采用char * 類型的形參,而對(duì)其它平臺(tái),均仍采用System V標(biāo)準(zhǔn)的void * 類型形參,比如: ifdef _SOLARIS_SHARED_MEMORY shmdt((char *)mem_addr)。 else shmdt((void *)mem_addr)。 endif 回頁(yè)首6. 通過(guò)shmctl刪除共享內(nèi)存的風(fēng)險(xiǎn)當(dāng)進(jìn)程斷開(kāi)與共享內(nèi)存區(qū)的連接后,一般通過(guò)如下代碼刪除該共享內(nèi)存: shmctl(mem_id, IPC_RMID, NULL)。 從HPUX上shmctl函數(shù)的man幫助,我們可以看到對(duì)IPC_RMID操作的說(shuō)明:IPC_RMID Remove the shared memory identifier specified by shmid from the system and destroy the shared memory segment and data structure associated with it. If the segment is attached to one or more processes, then the segment key is changed to IPC_PRIVATE and the segment is marked removed. The segment disappears when the last attached process detaches it.其它UNIX平臺(tái)也有類似的說(shuō)明。關(guān)于shmctl的IPC_RMID操作,其使用特點(diǎn)可簡(jiǎn)述如下: 如果共享內(nèi)存已經(jīng)與所有訪問(wèn)它的進(jìn)程斷開(kāi)了連接,則調(diào)用IPC_RMID子命令后,系統(tǒng)將立即刪除共享內(nèi)存的標(biāo)識(shí)符,并刪除該共享內(nèi)存區(qū),以及所有相關(guān)的數(shù)據(jù)結(jié)構(gòu); 如果仍有別的進(jìn)程與該共享內(nèi)存保持連接,則調(diào)用IPC_RMID子命令后,該共享內(nèi)存并不會(huì)被立即從系統(tǒng)中刪除,而是被設(shè)置為IPC_PRIVATE狀態(tài),并被標(biāo)記為已被刪除;直到已有連接全部斷開(kāi),該共享內(nèi)存才會(huì)最終從系統(tǒng)中消失。于是,存在這樣的一種狀態(tài):o N個(gè)進(jìn)程(進(jìn)程1至進(jìn)程N(yùn))已經(jīng)與某共享內(nèi)存區(qū)連接; o 進(jìn)程1已完成對(duì)此共享內(nèi)存的操作,斷開(kāi)連接后,調(diào)用shmctl的IPC_RMID子命令,企圖刪除該共享內(nèi)存; o 由于進(jìn)程2至進(jìn)程N(yùn)仍保持與該共享內(nèi)存的連接,因此在它們?nèi)繑嚅_(kāi)連接之前,這個(gè)共享內(nèi)存區(qū)毫無(wú)疑問(wèn)地會(huì)依然存在。 此時(shí),如果有其它的進(jìn)程(比如第N+1號(hào)進(jìn)程)想建立對(duì)這個(gè)共享內(nèi)存的連接,是否能夠成功呢?類似的狀態(tài),在Windows上同樣存在,只是程序借助的API有所不同,比如通過(guò)CreateFileMapping函數(shù)創(chuàng)建共享內(nèi)存,通過(guò)M
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)教案相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1