?? shm.c
字號:
#include <comlib.h>#include <sys/shm.h>#include <setjmp.h>int CreateMemo(int shmid, int index, int size){ char *pc; int *pd; if ((pc = shmat(shmid, NULL, 0)) == NULL) return -1; pd = (int *) pc; pd[0] = index; /* 共享內存數據區劃分的記錄塊數 */ pd[1] = 0; /* 當前已經使用的記錄塊數 */ pd[2] = 0; /* 最近一次分配的記錄編號 */ pd[3] = size; /* 每個記錄塊的長度 */ memset(pc+sizeof(int)*4, 0, size); /* 重置MAP區 */ shmdt(pc); return 0; }int AllocMemoExt(char *pc, int *index){ int nSize, nUsed, nOff, i; int *pd = (int *)pc; nSize = pd[0]; /* 記錄塊數 */ nUsed = pd[1]; /* 已分配數 */ nOff = pd[2]; /* 最近分配序號 */ if (nUsed >= nSize) return -1; pc = pc + sizeof(int)*4; /* MAP區 */ for (i=0; i<nSize; i++) /* 從nOff處查找空閑記錄 */ { if ((pc[nOff] & 0xff) == 0) break; nOff = (nOff+1) % nSize; } if (i >= nSize) return -2; pc[nOff] = 1; /* 更改記錄空閑標記 */ pd[1]++; /* 已分配數加1 */ pd[2] = nOff; /* 最近分配記錄序號 */ *index = nOff; return(0);}int AllocMemo(int shmid, int semid, int semindex, int *index){ char *paddr; int ret; if ((paddr = shmat(shmid, NULL, 0)) == NULL) return -2; if (SEMP(semid, semindex) != 0) /* 信號P操作,申請操作共享內存資源 */ { shmdt(paddr); return -3; } ret = AllocMemoExt(paddr, index); /* 分配記錄 */ SEMV(semid, semindex); /* 信號V操作,釋放操作共享內存資源 */ shmdt(paddr); /* 取消共享內存映射 */ return(ret);}int FreeMemo(int shmid, int semid, int semindex, int index){ char *paddr, *pc; int *pd; if ((paddr = shmat(shmid, NULL, 0)) == NULL) return -2; if (SEMP(semid, semindex) != 0) /* 信號P操作,申請操作共享內存資源 */ { shmdt(paddr); return -3; } pd = (int *)paddr; pc = paddr + sizeof(int)*4; /* MAP區首地址 */ if (index >=0 && index < pd[0]) { /* 釋放記錄 */ pc[index] = 0; /* 更改記錄空閑標記 */ pd[1]--; /* 已分配數減1 */ } SEMV(semid, semindex); /* 信號V操作,釋放操作共享內存資源 */ shmdt(paddr); /* 取消共享內存映射 */ return(0);}char *GetMemoAddr(char *paddr, int index){ int *pd = (int *)paddr; int nSize, nUsed; if (index < 0 || index >= pd[0]) return NULL; return (paddr + sizeof(int)*4 + /* 信息區,4個整型 */ pd[0]* sizeof(char) + /* MAP區,pd[0]個字節 */ pd[3] * index); /* 數據區,每個記錄pd[3]字節 */}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -