UNIX共享記憶體的程式(轉)
UNIX共享記憶體的程式(轉)[@more@]/******************************************************************************
* 函式名: MallocPublicMemory
* 作者: linge_king
* 編寫日期:2002.04
* 函式功能:為結構分配共享記憶體
* 輸入: StructName:結構物件變數,Num:記錄個數,Point:結構指標,Size:結構尺寸
* 輸出: 無
*返回值: 返回分配記憶體的首地址
*
* 修改記錄(如果有)
* 注意事項:
*******************************************************************************/
void *MallocPublicMemory(void *Point,long Num,long Size,char *StruName)
{
char lc_Tmp[LONG_STRING_SIZE];
int li_SemId;/**/
int li_ShmId;/**/
long ll_Size;/**/
long *lp_Temp;/**/
if((li_SemId=semget(Tables.Property[Param.PresentRecord].MemKey,1,IPC_CREAT|IPC_EXCL|0664))<1)
{
sprintf(lc_Tmp,"資料已初始化過 (%s表)",Tables.Property[Param.PresentRecord].TableName);
perror(lc_Tmp);
Param.ExistFlag = 1;/*當前共享記憶體的初始化標誌*/
return;
}
if(semctl(li_SemId,0,SETVAL,0)) /* set sem,lock it */
{
perror("初始化訊號燈失敗");
exit(5);
}
printf("訊號燈ID=%.7d, ",li_SemId);
ll_Size =sizeof(long) + Num * Size;
printf("共享記憶體大小%.10d (%s表) ",ll_Size,StruName);
/* 建立共享記憶體 */
if((li_ShmId = shmget(Tables.Property[Param.PresentRecord].MemKey+1,ll_Size,IPC_CREAT|IPC_EXCL|0664))<1)
{
sprintf(lc_Tmp,"使用者%s共享記憶體建立失敗",StruName);
perror(lc_Tmp);
exit(5);
}
/* 取共享記憶體地址 */
if((lp_Temp = (long *)shmat(li_ShmId,NULL,0)) == (void*)-1)/* get addr */
{
sprintf(lc_Tmp,"開啟%s共享記憶體失敗",StruName);
perror(lc_Tmp);
exit(5);
}
*lp_Temp = Num;
if(Num > 0)
{
Point = (void *)(lp_Temp + sizeof(long));
}
else
{
Point = NULL;
}
Param.SemId = li_SemId;
return(Point);
}
* 函式名: MallocPublicMemory
* 作者: linge_king
* 編寫日期:2002.04
* 函式功能:為結構分配共享記憶體
* 輸入: StructName:結構物件變數,Num:記錄個數,Point:結構指標,Size:結構尺寸
* 輸出: 無
*返回值: 返回分配記憶體的首地址
*
* 修改記錄(如果有)
* 注意事項:
*******************************************************************************/
void *MallocPublicMemory(void *Point,long Num,long Size,char *StruName)
{
char lc_Tmp[LONG_STRING_SIZE];
int li_SemId;/**/
int li_ShmId;/**/
long ll_Size;/**/
long *lp_Temp;/**/
if((li_SemId=semget(Tables.Property[Param.PresentRecord].MemKey,1,IPC_CREAT|IPC_EXCL|0664))<1)
{
sprintf(lc_Tmp,"資料已初始化過 (%s表)",Tables.Property[Param.PresentRecord].TableName);
perror(lc_Tmp);
Param.ExistFlag = 1;/*當前共享記憶體的初始化標誌*/
return;
}
if(semctl(li_SemId,0,SETVAL,0)) /* set sem,lock it */
{
perror("初始化訊號燈失敗");
exit(5);
}
printf("訊號燈ID=%.7d, ",li_SemId);
ll_Size =sizeof(long) + Num * Size;
printf("共享記憶體大小%.10d (%s表) ",ll_Size,StruName);
/* 建立共享記憶體 */
if((li_ShmId = shmget(Tables.Property[Param.PresentRecord].MemKey+1,ll_Size,IPC_CREAT|IPC_EXCL|0664))<1)
{
sprintf(lc_Tmp,"使用者%s共享記憶體建立失敗",StruName);
perror(lc_Tmp);
exit(5);
}
/* 取共享記憶體地址 */
if((lp_Temp = (long *)shmat(li_ShmId,NULL,0)) == (void*)-1)/* get addr */
{
sprintf(lc_Tmp,"開啟%s共享記憶體失敗",StruName);
perror(lc_Tmp);
exit(5);
}
*lp_Temp = Num;
if(Num > 0)
{
Point = (void *)(lp_Temp + sizeof(long));
}
else
{
Point = NULL;
}
Param.SemId = li_SemId;
return(Point);
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-945678/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 共享記憶體記憶體
- 程式間通訊---共享記憶體記憶體
- Golang 共享記憶體Golang記憶體
- POSIX共享記憶體記憶體
- oracle 共享記憶體Oracle記憶體
- POSIX 共享記憶體記憶體
- 程式間通訊之共享記憶體記憶體
- nginx共享記憶體分析Nginx記憶體
- QT之共享記憶體QT記憶體
- 共享記憶體函式記憶體函式
- shmget() -- 建立共享記憶體記憶體
- SGA與共享記憶體記憶體
- linux共享記憶體Linux記憶體
- linux程式間的通訊(C): 共享記憶體Linux記憶體
- 多程式、共享記憶體的網路聊天室記憶體
- nginx中共享記憶體的使用Nginx記憶體
- Linux共享記憶體的管理Linux記憶體
- 自動共享記憶體管理 自動記憶體管理 手工記憶體管理記憶體
- Linux程式間通訊之共享記憶體Linux記憶體
- Linux程式間通訊——使用共享記憶體Linux記憶體
- OpenResty 和 Nginx 的共享記憶體區是如何消耗實體記憶體的RESTNginx記憶體
- Qt共享記憶體QSharedMemoryQT記憶體
- Linux共享記憶體(二)Linux記憶體
- 修改/dev/shm共享記憶體dev記憶體
- 共享記憶體分段問題記憶體
- SGA與共享記憶體2記憶體
- 在C++Builder中建立共享記憶體段 (轉)C++UI記憶體
- 修改OracleLinux共享記憶體的大小OracleLinux記憶體
- SGA與共享記憶體的關係記憶體
- 實現共享記憶體的又一方法 (轉)記憶體
- 求助:關於linux下共享記憶體的問題(轉)Linux記憶體
- C++ 共享記憶體ShellCode跨程式傳輸C++記憶體
- 程式-IPC 共享記憶體和訊息佇列 (三)記憶體佇列
- UNIX系統記憶體檢視方法記憶體
- 【記憶體管理】Oracle如何使用ASMM自動共享記憶體管理記憶體OracleASM
- 共享記憶體相關(ipcs/ipcrm)記憶體
- aix 共享記憶體段大小限制AI記憶體
- linux共享記憶體段研究Linux記憶體